gpt4 book ai didi

haskell - 了解 Either 如何是 Functor 的实例

转载 作者:行者123 更新时间:2023-12-03 07:50:52 26 4
gpt4 key购买 nike

在我的空闲时间我正在学习 Haskell,所以这是一个初学者问题。

在我的阅读中,我遇到了一个示例,说明 Either a被设为 Functor 的实例:

instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x

现在,我试图理解为什么在 Right 的情况下实现映射值构造函数,但在 Left 的情况下没有?

以下是我的理解:

首先让我将上面的实例重写为
instance Functor (Either a) where
fmap g (Right x) = Right (g x)
fmap g (Left x) = Left x

现在:
  • 我知道fmap :: (c -> d) -> f c -> f d
  • 如果我们替换 fEither a我们得到 fmap :: (c -> d) -> Either a c -> Either a d
  • Right (g x) 的类型是 Either a (g x) ,以及 g x 的类型是 d ,所以我们有 Right (g x) 的类型是 Either a d ,这是我们对 fmap 的期望(见上文 2.)
  • 现在,如果我们看一下 Left (g x)我们可以用同样的理由说它的类型是Either (g x) b ,即 Either d b ,这不是我们对 fmap 的期望(见上文 2.):d应该是第二个参数,而不是第一个!所以我们不能映射 Left .

  • 我的推理正确吗?

    最佳答案

    这是正确的。这种行为还有一个相当重要的原因:你可以想到Either a b。作为计算,可能会成功并返回 b或失败并显示错误消息 a . (这也是 monad 实例的工作方式)。所以很自然,仿函数实例不会触及 Left值,因为你想映射计算,如果它失败了,就没有什么可操作的了。

    关于haskell - 了解 Either 如何是 Functor 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5195254/

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