可以使用来自 的运算符来满足规范Control.Applicative
。
myMin :: Ord x => Maybe x -> Maybe x -> Maybe x
myMin a b = min <$> a <*> b <|> a <|> b
<|>
forMaybe
实现“偏好”的地方
Nothing <|> b = b
a <|> _ = a
事情是
min <$> Just a <*> Just b = Just (min a b)
但
min <$> Just a <*> Nothing = Nothing
这导致对这个问题的一些错误答案。Using<|>
允许您在计算值可用时更喜欢计算min
值,但在只有一个时使用任一个人恢复Just
。
但是你应该问是否适合以Maybe
这种方式使用。Monoid
除了它的实例这个不光彩的例外,它Maybe
被设置为对容易发生故障的计算进行建模。您在这里所拥有的是Ord
具有“顶部”元素的现有扩展。
data Topped x = Val x | Top deriving (Show, Eq, Ord)
你会发现min
forTopped x
正是你所需要的。将类型不仅视为数据的表示,而且将其视为具有结构的数据的设备,这很好。Nothing
通常代表某种失败,因此最好为您的目的使用不同的类型。