Maybe
表示可能由于错误而不会产生结果的计算。因此,这样的计算必须是短路的。
NowMaybe
的 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
我不想说这些替代实例更好。但它们似乎也很有用。那么为什么首先做出选择而不是将实现留给用户呢?