我正在做Typeclassopedia的练习;在该Applicative
部分中,我编写了ZipList
'spure
函数,并检查它是否遵循Applicative
法律。
我检查过:
- 身份法
- 互换法
- 组成法
但是当我尝试检查“同态”定律时,我发现 GHCi 没有得到MZipList
.
我认为这是因为我错过了指定pure
我的Applicative
类型类。没有它如何立即运行pure
函数?</p>
<*>
Applicative
这是MZipList
定义和类实例:
newtype MZipList a = MZipList { getZipList :: [a] }
deriving (Show)
instance Functor MZipList where
fmap gs x = pure gs <*> x
instance Applicative MZipList where
pure a= MZipList (repeat a)
(MZipList gs) <*> (MZipList xs) = MZipList (zipWith ($) gs xs)
当我检查“交换”法时,例如:
*Main> (MZipList [(*2),(*3),(*4)]) <*> pure (2)
MZipList {getZipList = [4,6,8]}
*Main> pure ($ 2) <*> (MZipList [(*2),(*3),(*4)])
MZipList {getZipList = [4,6,8]}
但是当我检查“同态”定律时,不叫MZipList
's :pure
*Main> pure (*2) <*> pure 2
4
*Main> pure ((*2) 2)
4
*Main>
这是为什么?