gpt4 book ai didi

haskell - 为什么 Either 没有替代实例,而是有一个行为与替代类似的半群?

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

我是一个 Haskell 新手,我想知道为什么没有 Either 的替代实例,而是一个半群,它的行为正如我所期望的替代实例:

instance Semigroup (Either a b) where
Left _ <> b = b
a <> _ = a

此实例会丢弃或纠正“错误”,并且当两个操作数都标有 Right 时,它将采用第一个操作数。这不正是替代性提供的“选择”吗?

我希望半群实例大致如下:

instance (Semigroup b) => Semigroup (Either a b) where
Left e <> _ = Left e
_ <> Left e = Left e
Right x <> Right y = Right (x <> y)

这意味着它会传播错误并附加常规结果。

我想我对Either或所涉及的类型类有错误的概念。

最佳答案

您对 Alternative 有何期望?实例给你。我认为这是一个让您了解如何做的好方法 AlternativeSemigroup不同之处在于查看另一种具有两者实例的类型:例如 Maybe String :

λ > Just "a" <> Just "b"
Just "ab"
λ > Just "a" <> Nothing
Just "a"
λ > Nothing <> Just "b"
Just "b"
λ > Nothing <> Nothing
Nothing


λ > Just "a" <|> Just "b"
Just "a"
λ > Just "a" <|> Nothing
Just "a"
λ > Nothing <|> Just "b"
Just "b"
λ > Nothing <|> Nothing
Nothing

好吧,所以主要区别似乎是 Just "a"Just "b" 。这是有道理的,因为您在 Semigroup 的情况下将它们组合起来。而不是在 Alternative 的情况下采取左偏选项.

现在为什么你不能拥有 Alternative Either 的实例。如果您查看 Alternative 中的函数类型类别:

λ > :i Alternative
class Applicative f => Alternative (f :: * -> *) where
empty :: f a
(<|>) :: f a -> f a -> f a
some :: f a -> f [a]
many :: f a -> f [a]
{-# MINIMAL empty, (<|>) #-}

看起来它定义了 empty 的概念;这是 (<|>) 的身份运算符(operator)。在这种情况下,身份意味着身份与其他事物之间的选择始终是其他事物。

现在,您将如何为Either e a构建一个身份?如果您查看 Alternative 上的约束例如,您可以看到它需要 f拥有 Applicative实例。很好,Either有一个 ApplicativeEither e 声明的实例。正如您所看到的Either只是第二个类型变量上的应用仿函数(在 a 的情况下为 Either e a )。所以身份为Either e需要e也有一个身份。虽然可以构造一个类型,其中 e有一个实例 Alternative您无法为 Alternative 创建实例对于 Either与此e因为类型类定义中没有这样的约束(类似于: (Alternative e, Applicative (f e)) => Alternative (f e) )。

TL;DR:如果我的胡言乱语弄丢了你,我很抱歉,最重要的是fEither 的情况下属于错误的种类Alternative需要f :: * -> *Either善良 Either :: * -> * -> *

所以Maybe可以有 Alternative 的实例因为它有种类 Maybe : * -> *并具有 Nothing 所需的身份概念 ( empty ) 。查看 Alternative 的所有实例并注意每个实例数据类型的种类。

你可以通过 :k 找到 ghci 中数据类型的种类:

λ > :k Maybe
Maybe :: * -> *
λ > :k Either
Either :: * -> * -> *

关于haskell - 为什么 Either 没有替代实例,而是有一个行为与替代类似的半群?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44472008/

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