您的問題有幾種解決方案,都基於模式匹配。我假設你有兩種算法(因爲你沒有他們的名字,我會):
algorithm1 :: a -> Maybe b
algorithm2 :: b -> c
input :: a
1)Pattern matching通常,無論是從case語句(下)或函數來完成。
let val = algorithm1 input
in case val of
Nothing -> defaultValue
Just x -> algorithm2 x
所有其他提出的解決方案使用模式匹配,我只是提出執行模式匹配的標準函數。
2)前奏(和Data.Maybe)有一些內置函數來處理Maybe
s。 maybe函數是一個偉大的,我建議你使用它。它在標準庫定義爲:
maybe :: c -> (b -> c) -> Maybe b -> c
maybe n _ Nothing = n
maybe _ f (Just x) = f x
你的代碼是這樣:
maybe defaultValue algorithm2 (algorithm1 input)
3)由於可能是functor你可以使用fmap。如果你沒有默認值,這會更有意義。定義:
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
所以,你的代碼看起來像:
fmap algorithm2 (algorithm1 input)
,此輸出將是一個Maybe
值(Nothing
如果算法1的結果是Nothing
)。
4)最後,強烈不鼓勵,是fromJust
。只有在積極時才使用它,第一個算法將返回Just x
(而不是Nothing
)。小心!如果您在val = Nothing
時致電fromJust val
,那麼您將得到一個異常,這在Haskell中不受歡迎。它的定義:
fromJust :: Maybe b -> b
fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck
fromJust (Just x) = x
離開你的代碼看起來像:
algorithm2 (fromJust (algorithm1 input))
也許是,如果你的不確定返回值的類型使用。例如你的方法可能會返回一個錯誤字符串。 – 2010-07-30 21:36:01
@Jonathan Fischoff:如果你不確定類型,可能不會被使用。沒有辦法returnng'Maybe([(Int,Int)],(Int,Int))''可以返回一個錯誤字符串。也許在你不知道你是否有回報價值的情況下使用,所以你可以返回只值或無。 – Chuck 2010-07-30 21:44:55
@Jonathan Fischoff:部分正確。當可能沒有結果(Nothing)時使用Maybe,例如'getPosition :: List a - > Maybe Integer'。您可以使用'Either'返回(無雙關語)有效返回值(右)或錯誤(左)。編輯:@Chuck速度更快。 – delnan 2010-07-30 21:45:31