是否可以在haskell中折叠<*>?

wor*_*tor 5 haskell

我想意识到

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)

但似乎不可能使<*>递归。

dan*_*iaz 4

让我们玩一下 ghci 中的类型,看看它们会把我们带到哪里。

\n\n
\xce\xbb import Control.Applicative\n
Run Code Online (Sandbox Code Playgroud)\n\n

的类型(<*>)

\n\n
\xce\xbb :t (<*>)\n(<*>) :: Applicative f => f (a -> b) -> f a -> f b\n
Run Code Online (Sandbox Code Playgroud)\n\n

类型foldr

\n\n
\xce\xbb :t Prelude.foldr\nPrelude.foldr :: (a -> b -> b) -> b -> [a] -> b\n
Run Code Online (Sandbox Code Playgroud)\n\n

也许我们可以使用(<*>)作为第一个参数传递的函数foldr。会是什么类型?

\n\n
\xce\xbb :t Prelude.foldr (<*>)\nPrelude.foldr (<*>) :: Applicative f => f a -> [f (a -> a)] -> f a\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,它似乎在应用上下文中获取初始值,并在应用上下文中获取函数列表,并返回另一个应用。

\n\n

例如,用作ZipList应用:

\n\n
\xce\xbb getZipList $ Prelude.foldr (<*>) (ZipList [2,3]) [ ZipList [succ,pred], ZipList [(*2)] ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是:

\n\n
[5]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不确定这是否是问题的目的,但这似乎是fold使用(<*>).

\n