getFirstError :: [Either a b] -> a
getFirstError (x:y:...:Left w:z) = w
WRT哈斯克爾,但它可能是有趣的,懂得其他語言與模式匹配做到這一點。
getFirstError :: [Either a b] -> a
getFirstError (x:y:...:Left w:z) = w
WRT哈斯克爾,但它可能是有趣的,懂得其他語言與模式匹配做到這一點。
可以,儘管其他的答案,在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
不,沒有。但是,您可以easiliy寫函數使用遞歸:
getFirstError [] = error "getFirstError: empty list or no error"
getFirstError (Left x : xs) = x
getFirstError (_ : xs) = getFirstError xs
沒有,但你可以使用列表理解
getFirstError xs = head [ x | Left x <- xs ]
需要注意的是,如果沒有錯誤head
將失敗。
和'head'失敗本身就是一個錯誤不同的品種,所以你可以說這個函數總是會找到* some *錯誤,這種或那種方式! –
你是否意外地忽略了模式衛士版本中的'Just'構造函數的匹配? – Rotsor
另外,你需要用於錯誤類型的'Monoid'實例,這看起來不太合理,而'test'函數沒有編譯,因爲它沒有足夠的括號。並且返回所有錯誤的連接而不是第一個錯誤。 – Rotsor
替換'mconcat。地圖測試 - >用'mconcat只是x'。 map(First。test) - > First(Just x)'應該這樣做。 – Rotsor