[Haskell-beginners] which Applicative instance?
math.simplex at gmail.com
Sun Nov 15 02:29:21 UTC 2015
I'm following the CIS194 lectures and exercises. In particular, in one
of the Applicative lectures  we're asked to implement mapA and
sequenceA, from the name and given type signature alone. I renamed them
mapA' and sequenceA' to avoid name clashes, and defined:
mapA' :: Applicative f => (a -> f b) -> ([a] -> f [b])
mapA' f = sequenceA' . map f
sequenceA' :: Applicative f => [f a] -> f [a]
sequenceA' = foldr (\fa fla -> (:) <$> fa <*> fla) (pure )
These implementations seem to be correct, though undoubtedly not the nicest.
Now, I ask for a type in ghci:
> :t mapA' pure [1..5]
mapA' pure [1..5] :: (Enum b, Num b, Applicative f) => f [b]
And so I try the following:
> mapA' pure [1..5] :: [[Int]]
> take 5 . getZipList $ (mapA' pure [1..5] :: ZipList [Int])
> mapA' pure [1..5] :: Maybe [Int]
That makes sense. But I don't understand the following:
> mapA' pure [1..5]
Which Applicative instance is being used here? The type test above says
my expression should have type f [b], where f is an Applicative and b is
a Num, but all I see is a result of type [b] when I compute mapA' pure
[1..5]. What's going on?
> :t pure
pure :: Applicative f => a -> f a
> pure [1..5]
a must match a list of Nums, but then where did f go? Is ghci using some
Actually, after I add the following lines to my source file:
ggg = pure [1..5]
hhh = mapA' pure [1..5]
I get the errors:
No instance for (Applicative f0) arising from a use of ‘pure’
No instance for (Applicative f1) arising from a use of ‘mapA'’
respectively. That makes sense to me.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Beginners