understanding function signature alignement

Hello, I'm going through Haskellbook and while doing some exercises I'm stack with trying to explain myself how types matches in this examples: meh :: Monad m => [a] -> (a -> m b) -> m [b] meh [] _ = pure [] meh (x:xs) f = (:) <$> f x <*> meh xs f flipType :: (Monad m) => [m a] -> m [a] flipType xs = meh xs id What puzzles me is how id function which is of type (a->a) can fit here where meh function is requesting function of type (a->m b)? The function (a -> m b) is function that says give me anything and I will give back anything wrapped up into some monad structure; id ( a -> a) on other hand says give me anything and I will return it back to you. So, to me, the first function is somehow more restricted than id function because it puts limitation on what output of that function can be and I'm struggling to understand how id function can fit here. I hope someone can help me how to reason about these functions here? thanks

The (a) and (b) are different in each case. Let's rewrite it and rename the variables to emphasise the difference. meh :: Monad m => [a] -> (a -> m b) -> m [b] flipType :: (Monad k) => [k x] -> k [x] id :: q -> q This means that id can accept any argument type, as long as it returns the same argument type. For example: id :: m b -> m b When it is used like that, then (a) turns into (m b). Similarly, meh can have this type: meh :: Monad m => [m b] -> (m b -> m b) -> m [b] All I did was specialise the (a) type-variable, which can be anything, as long as they all change. Now it is clear that when I put id into the second argument position, I get the type [m b] -> m [b] On 09/08/18 18:32, simkestuff@gmail.com wrote:
Hello,
I'm going through Haskellbook and while doing some exercises I'm stack with trying to explain myself how types matches in this examples:
meh :: Monad m => [a] -> (a -> m b) -> m [b] meh [] _ = pure [] meh (x:xs) f = (:) <$> f x <*> meh xs f
flipType :: (Monad m) => [m a] -> m [a] flipType xs = meh xs id
What puzzles me is how id function which is of type (a->a) can fit here where meh function is requesting function of type (a->m b)?
The function (a -> m b) is function that says give me anything and I will give back anything wrapped up into some monad structure; id ( a -> a) on other hand says give me anything and I will return it back to you. So, to me, the first function is somehow more restricted than id function because it puts limitation on what output of that function can be and I'm struggling to understand how id function can fit here.
I hope someone can help me how to reason about these functions here?
thanks
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

You can also put another function as the argument to the id : ghci > x :: a -> m b;x = undefined ghci > :t (id x) (id x) :: a -> m b
On 9 Aug 2018, at 10:36, Tony Morris
wrote: The (a) and (b) are different in each case. Let's rewrite it and rename the variables to emphasise the difference.
meh :: Monad m => [a] -> (a -> m b) -> m [b]
flipType :: (Monad k) => [k x] -> k [x]
id :: q -> q
This means that id can accept any argument type, as long as it returns the same argument type. For example:
id :: m b -> m b
When it is used like that, then (a) turns into (m b).
Similarly, meh can have this type:
meh :: Monad m => [m b] -> (m b -> m b) -> m [b]
All I did was specialise the (a) type-variable, which can be anything, as long as they all change. Now it is clear that when I put id into the second argument position, I get the type [m b] -> m [b]
On 09/08/18 18:32, simkestuff@gmail.com mailto:simkestuff@gmail.com wrote:
Hello,
I'm going through Haskellbook and while doing some exercises I'm stack with trying to explain myself how types matches in this examples:
meh :: Monad m => [a] -> (a -> m b) -> m [b] meh [] _ = pure [] meh (x:xs) f = (:) <$> f x <*> meh xs f
flipType :: (Monad m) => [m a] -> m [a] flipType xs = meh xs id
What puzzles me is how id function which is of type (a->a) can fit here where meh function is requesting function of type (a->m b)?
The function (a -> m b) is function that says give me anything and I will give back anything wrapped up into some monad structure; id ( a -> a) on other hand says give me anything and I will return it back to you. So, to me, the first function is somehow more restricted than id function because it puts limitation on what output of that function can be and I'm struggling to understand how id function can fit here.
I hope someone can help me how to reason about these functions here?
thanks
_______________________________________________ Beginners mailing list Beginners@haskell.org mailto:Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
participants (3)
-
sasa bogicevic
-
simkestuff@gmail.com
-
Tony Morris