gpt4 book ai didi

haskell - 如何使 Either 成为第二种类型的仿函数

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

我一直在阅读“Learn You A Haskell For Great Good!”现在我在“仿函数类型类”部分。

在这里,他们通过将第一个类型固定如下,将 Either 变成一个仿函数:

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

所以我想问,我怎样才能将 Either 变成第一种类型的仿函数(通过修复第二种类型),这样,我得到了 fmap 的以下定义
fmap f (Left x) = Left (f x)
fmap f (Right x) = Right x

最佳答案

你不能; Either a可以是仿函数,因为 Either 的部分应用有样* -> * ,但不能从右侧进行部分应用。

相反,您可能对 Bifunctor 感兴趣。 Either 的实例:

instance Bifunctor Either where
bimap f _ (Left a) = Left (f a)
bimap _ g (Right b) = Right (g b)
bimap接受两个函数,一个用于由 Either 包装的两种类型中的每一个.
> bimap (+1) length (Left 3)
Left 4
> bimap (+1) length (Right "hi")
Right 2

还有 firstsecond专注于一种或另一种类型的功能。 second对应于常规 fmap对于 Either ; first是您正在寻找的功能。
> first (+1) (Left 3)
Left 4
> first (+1) (Right 3)
Right 3
> second (+1) (Left 3)
Left 3
> second (+1) (Right 3)
Right 4

(给@leftaroundabout的帽子提示)
Control.Arrow模块提供 left函数,实际上与 second 相同,但具有更具描述性的名称和不同的派生。比较它们的类型:
> :t Data.Bifunctor.second
Data.Bifunctor.second :: Bifunctor p => (b -> c) -> p a b -> p a c
> :t Control.Arrow.left
Control.Arrow.left :: ArrowChoice a => a b c -> a (Either b d) (Either c d)
second被硬编码以使用函数并且可以被 p ~ Either 限制. left被硬编码以使用 Either并且可以被 a ~ (->) 限制.

令人困惑的是, Control.Arrow还提供了 second类似于 Bifunctor 的函数元组的实例:
> :t Control.Arrow.second
Control.Arrow.second :: Arrow a => a b c -> a (d, b) (d, c)

> Control.Arrow.second (+1) (1,2) == Data.Bifunctor.second (+1) (1,2)
True

关于haskell - 如何使 Either 成为第二种类型的仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50253569/

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