a liftM2 :: (Monad m) => (a -> b -> c) -> m a -> m b -> m c ap :: (Monad m) => m -6ren">
gpt4 book ai didi

haskell - 如何理解 "ap = liftM2 id"的类型推断?

转载 作者:行者123 更新时间:2023-12-02 16:03:27 24 4
gpt4 key购买 nike

id     :: a -> a
liftM2 :: (Monad m) => (a -> b -> c) -> m a -> m b -> m c

ap :: (Monad m) => m (a -> b) -> m a -> m b
ap = liftM2 id

您能否帮忙解释一下,当 liftM2 应用于 id 时,如何推断出 ap 的类型?此外,提出等效问题是否有效,但更具体地说,如何将 (a -> b -> c) -> m a 简化为 m (a -> b)在这种情况下?

最佳答案

让我们尝试找出 liftM2 id 的类型。首先,我们更改id中的类型参数,这样我们就可以更容易地解决这个问题。

id     :: x -> x
liftM2 :: (Monad m) => (a -> b -> c) -> m a -> m b -> m c

接下来,我们在 liftM2 中添加额外的括号,并记住 a -> b -> c 实际上是 a -> (b -> c):

id     :: x -> x
liftM2 :: (Monad m) => (a -> (b -> c)) -> m a -> (m b -> m c)

现在我们移动 x -> x 以将其与 liftM2 中的其他类型对齐:

id     ::               x -> x
liftM2 :: (Monad m) => (a -> (b -> c)) -> m a -> (m b -> m c)

好的。这告诉我们 liftM2 id 中的 a ~ (b -> c),或者:

id     ::               (b -> c) -> (b -> c)
liftM2 :: (Monad m) => ((b -> c) -> (b -> c))
-> m (b -> c) -> (m b -> m c)

现在我们可以使用这些专用版本:

liftM2 id :: Monad m => m (b -> c) -> (m b -> m c)

我们删除多余的括号并最终得到正确的类型:

liftM2 id :: Monad m => m (b -> c) -> m b -> m c

关于haskell - 如何理解 "ap = liftM2 id"的类型推断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29154049/

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