2011-07-09 50 views

回答

6

可以,儘管其他的答案,在GHC做到這一點使用視圖模式擴展:

getFirstError ((msum . map test) -> Just x) = x 
     where test (Left x) = Just x 
       test (Right x) = Nothing 

或者使用模式衛士:

getFirstError (xs) | Just x <- (msum $ map test xs) = x 
     where test (Left x) = Just x 
       test (Right) x = Nothing 
+0

你是否意外地忽略了模式衛士版本中的'Just'構造函數的匹配? – Rotsor

+0

另外,你需要用於錯誤類型的'Monoid'實例,這看起來不太合理,而'test'函數沒有編譯,因爲它沒有足夠的括號。並且返回所有錯誤的連接而不是第一個錯誤。 – Rotsor

+0

替換'mconcat。地圖測試 - >用'mconcat只是x'。 map(First。test) - > First(Just x)'應該這樣做。 – Rotsor

1

不,沒有。但是,您可以easiliy寫函數使用遞歸:

getFirstError [] = error "getFirstError: empty list or no error" 
getFirstError (Left x : xs) = x 
getFirstError (_ : xs) = getFirstError xs 
2

沒有,但你可以使用列表理解

getFirstError xs = head [ x | Left x <- xs ] 

需要注意的是,如果沒有錯誤head將失敗。

+3

和'head'失敗本身就是一個錯誤不同的品種,所以你可以說這個函數總是會找到* some *錯誤,這種或那種方式! –

相關問題