gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:26:05 27 4
gpt4 key购买 nike

我想实现类似的东西

fun1 f a_ziplist

例如
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]]

为此,我想递归地应用 <*> 之类的
foldx (h:w) = h <*> foldx w
foldx (w:[]) = w

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

最佳答案

让我们玩转 ghci 中的类型,看看它们将我们带到哪里。

λ import Control.Applicative
(<*>)的类型
λ :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
foldr的类型:
λ :t Prelude.foldr
Prelude.foldr :: (a -> b -> b) -> b -> [a] -> b

也许我们可以使用 (<*>)作为作为 foldr的第一个参数传递的函数.会是什么类型?
λ :t Prelude.foldr (<*>)
Prelude.foldr (<*>) :: Applicative f => f a -> [f (a -> a)] -> f a

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

例如,使用 ZipList作为申请:
λ getZipList $ Prelude.foldr (<*>) (ZipList [2,3]) [ ZipList [succ,pred], ZipList [(*2)] ]

结果是:
[5]

我不确定这是否是问题的意图,但这似乎是 fold 的自然方式。使用 (<*>) .

关于haskell - 是否可以在haskell中折叠 <*> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25199585/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com