我很好奇在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关键字的一些东西。 谢谢!
答案 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]