gpt4 book ai didi

haskell - 在 Haskell 中实现 liftM2

转载 作者:行者123 更新时间:2023-12-02 14:49:29 26 4
gpt4 key购买 nike

作为练习,我一直在尝试仅使用函数 ap 和 liftM 来实现 liftM2。函数定义为:

ap :: IO (a -> b) -> IO a -> IO b
liftM :: (a -> b) -> IO a -> IO b

liftM2 :: (a -> b -> c) -> IO a -> IO b -> IO c

我可以使用 do 表示法轻松执行 liftM2,但不知道如何仅使用 ap 和 liftM 来执行此操作。我正在考虑让结果看起来像这样:

liftM2 f a b = liftM (_) (ap _ a)

我对如何弄乱 f 感到困惑,它是 (a -> b -> c),这样我就可以将 a 转换为 b,将 b 转换为 c。谢谢。

最佳答案

总体模式正在转变

liftMn f a1 ... an

进入

f <$> a1 <*> ... <*> an
-- i.e., more precisely
(... ((f <$> a1) <*> a2) ... <*> an)

哪里<$>liftM (又名 fmap )和 <*>ap .

因此,对于 n=2我们得到

(f `liftM` a1) `ap` a2
-- i.e.
ap (liftM f a1) a2

检查类型:

f :: t1 -> t2 -> r
liftM f :: IO t1 -> IO (t2 -> r)
a1 :: IO t1
liftM f a1 :: IO (t2 -> r)
ap (liftM f a1) :: IO t2 -> IO r
a2 :: IO t2
ap (liftM f a1) a2 :: IO r

这里的关键思想是阅读 f :: t1 -> t2 -> rf :: t1 -> (t2 -> r)这样liftM f :: IO t1 -> IO (t2 -> r)接下来。请注意 IO 内的函数类型。然后我们就可以“分发”IO超过->使用ap ,这样我们就可以申请a2 :: IO t2 .

关于haskell - 在 Haskell 中实现 liftM2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53145952/

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