Возможно выполнение спецификации с использованием операторов от Control.Applicative
.
myMin :: Ord x => Maybe x -> Maybe x -> Maybe x
myMin a b = min <$> a <*> b <|> a <|> b
<|>
где для Maybe
реализует "предпочтение"
Nothing <|> b = b
a <|> _ = a
Дело в том,
min <$> Just a <*> Just b = Just (min a b)
но
min <$> Just a <*> Nothing = Nothing
, которая привела к некоторому incorre ct отвечает на этот вопрос. Используя <|>
, вы можете предпочесть вычисленное значение min
, когда оно доступно, но восстановить с любым человеком, если только один - Just
.
Но вы должны спросить, целесообразно ли использовать Maybe
таким образом. С бесславным исключением своего экземпляра Monoid
, Maybe
настроен для моделирования отказоустойчивых вычислений. Здесь у вас есть расширение существующего Ord
с «верхним» элементом.
data Topped x = Val x | Top deriving (Show, Eq, Ord)
и вы увидите, что min
для Topped x
это именно то, что вам нужно. Приятно думать о типах, а не о представлении данных, а о оборудовании данных со структурой. Nothing
обычно представляет собой какой-то сбой, поэтому было бы лучше использовать другой тип для вашей цели.
до того, как я опустился вниз от этого поросенка;) ... как насчет: 'пусть minM a b = возможно, просто $ может быть b Просто $ min a b '? – Carsten
Может быть, [только это] (http://ideone.com/GH4K7K) –
n.m, это работает, но это не проще, чем то, с чего я начинаю. – clay