2010-07-30 48 views
15

我有了的Maybe ([(Int,Int)],(Int,Int))從一個也許返回工作包含「只是」

返回類型,我想從另一個函數調用這個和對數據進行操作的功能。

但是,返回值包含在Just內。第二種方法需要([(Int,Int)],(Int,Int)),因此不會接受Just ([(Int,Int)],(Int,Int))

在應用第二種方法之前,我可以修整Just嗎?

我不完全理解在Maybe範圍內使用Just - 但是,我被告知第一個方法的返回類型必須是Maybe

+0

也許是,如果你的不確定返回值的類型使用。例如你的方法可能會返回一個錯誤字符串。 – 2010-07-30 21:36:01

+7

@Jonathan Fischoff:如果你不確定類型,可能不會被使用。沒有辦法returnng'Maybe([(Int,Int)],(Int,Int))''可以返回一個錯誤字符串。也許在你不知道你是否有回報價值的情況下使用,所以你可以返回只值或無。 – Chuck 2010-07-30 21:44:55

+0

@Jonathan Fischoff:部分正確。當可能沒有結果(Nothing)時使用Maybe,例如'getPosition :: List a - > Maybe Integer'。您可以使用'Either'返回(無雙關語)有效返回值(右)或錯誤(左)。編輯:@Chuck速度更快。 – delnan 2010-07-30 21:45:31

回答

6

您正在尋找fromJust。但只有當你是某些你的Maybe函數不會返回Nothing

+0

謝謝,那會做。 它總是從這個方法調用時返回一個值,因爲我只是回收爲其他東西寫的方法。來自Just的 – KeepItFoolish 2010-07-30 21:47:21

+11

在Haskell中被認爲是不好的形式 - 正如任何部分函數(如head)一樣。我會推薦TomMD的答案中的任何一種選擇。 – luqui 2010-07-30 22:26:13

46

您的問題有幾種解決方案,都基於模式匹配。我假設你有兩種算法(因爲你沒有他們的名字,我會):

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)) 
+3

我反其道而行:模式匹配是處理「Maybe」結果的規範方式,其他模式只是常見方式的縮寫。 (由於OP可能不知道它們,我也會說明它們的定義。) – 2010-08-01 08:40:20

+0

好點。回想起來,我認爲我從「僅僅從......開始」僅僅是因爲那是答覆已經提出並且被提問者非正式接受的。 – 2010-08-01 17:52:52

+0

儘管有'yuck',我發現從最簡單的方法來理解這一點。無論如何謝謝你的回答。 – vikingsteve 2013-09-24 09:23:52

相關問題