我想意识到
fun1 f a_ziplist
Run Code Online (Sandbox Code Playgroud)
例如
getZipList $ (\x y z -> x*y+z) <$> ZipList [4,7] <*> ZipList [6,9] <*> ZipList [5,10]
f = (\x y z -> x*y+z)
ziplist = [[4,7],[6,9],[5,10]]
Run Code Online (Sandbox Code Playgroud)
为此,我想递归地应用<*>
foldx (h:w) = h <*> foldx w
foldx (w:[]) = w
Run Code Online (Sandbox Code Playgroud)
但似乎不可能使<*>递归。
让我们玩一下 ghci 中的类型,看看它们会把我们带到哪里。
\n\n\xce\xbb import Control.Applicative\nRun Code Online (Sandbox Code Playgroud)\n\n的类型(<*>)
\xce\xbb :t (<*>)\n(<*>) :: Applicative f => f (a -> b) -> f a -> f b\nRun Code Online (Sandbox Code Playgroud)\n\n类型foldr:
\xce\xbb :t Prelude.foldr\nPrelude.foldr :: (a -> b -> b) -> b -> [a] -> b\nRun Code Online (Sandbox Code Playgroud)\n\n也许我们可以使用(<*>)作为第一个参数传递的函数foldr。会是什么类型?
\xce\xbb :t Prelude.foldr (<*>)\nPrelude.foldr (<*>) :: Applicative f => f a -> [f (a -> a)] -> f a\nRun Code Online (Sandbox Code Playgroud)\n\n因此,它似乎在应用上下文中获取初始值,并在应用上下文中获取函数列表,并返回另一个应用。
\n\n例如,用作ZipList应用:
\xce\xbb getZipList $ Prelude.foldr (<*>) (ZipList [2,3]) [ ZipList [succ,pred], ZipList [(*2)] ]\nRun Code Online (Sandbox Code Playgroud)\n\n结果是:
\n\n[5]\nRun Code Online (Sandbox Code Playgroud)\n\n我不确定这是否是问题的目的,但这似乎是fold使用(<*>).
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |