È possibile soddisfare le specifiche utilizzando gli operatori da Control.Applicative
.
myMin :: Ord x => Maybe x -> Maybe x -> Maybe x
myMin a b = min <$> a <*> b <|> a <|> b
dove il <|>
per Maybe
attrezzi "preferenza"
Nothing <|> b = b
a <|> _ = a
La cosa è
min <$> Just a <*> Just b = Just (min a b)
ma
min <$> Just a <*> Nothing = Nothing
che ha portato in qualche incorre ct risponde a questa domanda. L'utilizzo di <|>
consente di preferire il valore calcolato min
quando è disponibile, ma ripristinarlo individualmente quando uno solo è Just
.
Ma si dovrebbe chiedere se è opportuno utilizzare Maybe
in questo modo. Con l'ingloriosa eccezione della sua istanza Monoid
, Maybe
è impostato per modellare calcoli soggetti a errori. Quello che hai qui è l'estensione di uno Ord
esistente con un elemento "top".
data Topped x = Val x | Top deriving (Show, Eq, Ord)
e troverete che min
per Topped x
è proprio quello che serve. È bello pensare ai tipi non solo alla rappresentazione dei dati ma all'equipaggiamento dei dati con struttura. Nothing
rappresenta solitamente un tipo di errore, quindi potrebbe essere preferibile utilizzare un tipo diverso per lo scopo.
prima di essere svalutato da quel pigworker;) ... che dire: "lascia minM a b = forse un Just $ forse b Just $ min a b '? – Carsten
Forse [solo questo] (http://ideone.com/GH4K7K) –
n., Che funziona, ma non è più semplice quello che sto iniziando. – clay