gpt4 book ai didi

haskell - 为什么 Maybe 的 Semigroup 实例偏向 Just 而 Monoid 使用 Nothing 作为其空元素?

转载 作者:行者123 更新时间:2023-12-04 13:56:42 24 4
gpt4 key购买 nike

Maybe表示可能由于错误而不会产生结果的计算。因此,这样的计算必须是短路的。

现在Maybe的 Semigroup/Monoid 实例似乎打破了这种语义,因为前者偏向于 Just。后者处理错误情况Nothing作为它的空元素:

Just "foo" <> Nothing -- Just "foo"
Nothing <> Just "bar" -- Just "bar"
Just "foo" <> Just "bar" -- Just "foobar"
Nothing <> Nothing -- Nothing

我希望 Nothing对于前两种情况。

这是替代实现(希望它是正确/合法的):
instance Semigroup a => Semigroup (Maybe a) where
Nothing <> _ = Nothing
_ <> Nothing = Nothing
Just a <> Just b = Just (a <> b)

instance Monoid a => Monoid (Maybe a) where
mempty = Just mempty

我不想说这些替代实例更好。但它们似乎也很有用。那么为什么首先做出选择而不是将实现留给用户呢?

最佳答案

您的实例实际上是应用仿函数的更通用实例的特例。

newtype LiftA f a = LiftA { getLiftA :: f a }

instance (Applicative f, Semigroup a) => Semigroup (LiftA f a) where
LiftA x <> LiftA y = LiftA $ liftA2 (<>) x y

instance (Applicative f, Monoid a) => Monoid (LiftA f a) where
mempty = LiftA $ pure mempty

我认为它会在某个地方的标准库中(可能使用不同的名称),但我找不到它。但是这个通用实例的存在可能是选择 Maybe 库版本的原因之一。 , 更多的是 Maybe的特殊力量。另一方面,当您的代数结构彼此一致时,这非常好;即当一个类型是 Applicative ,尽可能使用“ LiftA ”样式实例(在所有 F-algebra 类上)。

另一方面(!),我们不可能在任何地方都有一致性,因为库实例与 Maybe 一致。的 MonadPlus实例。这与自然数上有两个幺半群的事实惊人地相似:加法和乘法。对于数字,我们只是选择不使用任何 monoid 实例,因为不清楚使用哪个。

总之,我不知道。但也许这些信息是有帮助的。

关于haskell - 为什么 Maybe 的 Semigroup 实例偏向 Just 而 Monoid 使用 Nothing 作为其空元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50170631/

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