可以使用来自 的运算符来满足规范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)
你会发现minforTopped x正是你所需要的。将类型不仅视为数据的表示,而且将其视为具有结构的数据的设备,这很好。Nothing通常代表某种失败,因此最好为您的目的使用不同的类型。