getZipList是如何定义的?

时间:2013-01-18 20:55:58

标签: haskell applicative

我很好奇在ghc中定义了getZipList的位置。 Control.Applicative对ZipList有这个定义。

newtype ZipList a = ZipList { getZipList :: [a] }

使用ZipLists的一种方法是(来自LYAH):

ghci> getZipList $ (+) <$> ZipList [1,2,3] <*> ZipList [100,100,100]

[101,102,103]

我很好奇getZipList如何知道返回什么。 也许我错过了关于newtype关键字的一些东西。 谢谢!

2 个答案:

答案 0 :(得分:11)

这不仅仅是newtype,它与data的作用相同。您似乎不知道的是命名字段语法,

newtype ZipList a = ZipList { getZipList :: [a] }

几乎相同
newtype ZipList a = ZipList [a]

getZipList :: ZipList a -> [a]
getZipList (ZipList xs) = xs

但是命名字段语法允许更方便的更新和模式匹配 - 特别是对于具有多个字段的data类型中的命名字段更方便。

命名字段(隐式)定义访问器函数,该函数从包装值中提取包含的数据。

答案 1 :(得分:3)

秘密不在新类型定义中,而是在适用于&lt; *&gt;

的实例中
instance Applicative ZipList where  
pure x = ZipList (repeat x)  
ZipList fs <*> ZipList xs = ZipList [f x | (f,x) <- zip fs xs]

默认列表就是这样,而差异来自

instance Applicative [] where  
pure x = [x]  
fs <*> xs = [f x | f <- fs, x <- xs]