gpt4 book ai didi

haskell - 使用 id 定义 fmap 并返回

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

在 Bartosz Milewski 的程序员分类理论中,Milewski 编写了以下代码来定义 Writer monad 的返回值和“fish”运算符(Kleisli 类别中的组合)。

return :: a -> Writer a
return x = (x, "")

(>=>) :: (a -> Writer b) -> (b -> Writer c) -> (a -> Writer c)
m1 >=> m2 = \x ->
let (y, s1) = m1 x
(z, s2) = m2 y
in (z, s1 ++ s2)

然后,他继续定义 fmap,如下所示:

fmap f = id >=> (\x -> return (f x))

我很难理解这里如何使用 id 函数。 Fish 运算符的第一个参数显然是 (a -> Writer b) 但 id 具有类型签名 a -> a

这是我理解上的错误还是缺陷?将 id 替换为 return 对我来说更有意义。

最佳答案

不要忘记通用量化。

Fish (>=>) 的类型为 (a -> Writer b) -> ..... 对于任何 ab

id 的类型为 a -> a 对于任何 a

因此,特别是,对于任何 b,fish 也具有类型 (Writer b -> Writer b) -> ... (只需采用 a = Writer b 作为特例)。

此外,id 还具有类型 Writer b -> Writer b(同样,作为特殊情况)。

这里的“技巧”是使用统一来“合并”这两种类型。我们首先要求 (a -> Writer b) = (a' -> a'),然后推断 a = a'Writer b =一个'。从这里我们可以看出,这两种类型是可以统​​一的,所以传递参数不存在矛盾。

(另请注意,这里我们将 id 类型中的 a 重命名为 a',以避免与其他 混淆a 代表鱼)

关于haskell - 使用 id 定义 fmap 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50724336/

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