我正在嘗試創建一個函式,該函式justifyList采用Maybe物件串列 ( [Maybe a]) 并回傳所有型別物件的串列,丟棄引數串列中的Just任何元素。Nothing
我現在的解決方案是
justifyList :: [Maybe a] -> [a]
justifyList [] = []
justifyList (x:xs)
| (isNothing x) = justifyList xs
| otherwise = x : justifyList xs
我嘗試遞回遍歷引數串列并遞回地將當前元素放入x回傳的串列中[a],如果它是Just型別的話。
但是,在解釋型別不匹配時會產生錯誤
無法將型別 a 與 Maybe a 匹配
因此我的問題是;如何遞回地遍歷Maybe物件串列?如果此解決方案足夠,我如何轉換xs為Maybe型別?
uj5u.com熱心網友回復:
這樣的功能已經存在于Data.Maybe模塊中并被命名為catMaybes :: [Maybe a] -> [a].
您可以使用遞回來實作這一點,但使用串列推導可能更優雅,因為這允許我們同時有效地進行模式匹配和展開,所以:
justifyList :: [Maybe a] -> [a]
justifyList xs = [ x | Just x <- xs ]
僅對于滿足Just x模式的專案,它才會產生一個專案,因此也會Just x <- xs執行過濾。
uj5u.com熱心網友回復:
Maybes上的模式匹配
justifyList :: [Maybe a] -> [a]
justifyList [] = []
justifyList (Nothing:xs) = justifyList xs
justifyList (Just x:xs) = x : justifyList xs
uj5u.com熱心網友回復:
在該行justifyList (x:xs) x中是型別,Maybe a然后在| otherwise = x : justifyList xs您嘗試添加x::Maybe a到串列中的行中a。
您需要使用模式匹配打開Maybe型別,以便獲得內部的實際值。(我將使用顯式case陳述句,因為它使邏輯更容易,但最佳實踐是在函式本身中使用模式匹配 - 作為練習留給讀者)。
justifyList (x:xs) = case x of
Nothing -> justifyList xs
Just a -> a:justifyList xs
作為一般規則,僅| = ...當您需要進行一些測驗(如比較或函式評估)時才使用保護模式 ( )。當您只需要有關型別的一些資訊時(在實踐中大部分時間),請改用模式匹配或 case 陳述句。
對于那些可能在搜索中找到這個的人,我將添加最后一點catMaybes,Data.Maybe 中有一個函式已經完成了這個操作。
uj5u.com熱心網友回復:
如果串列的第一個元素是Nothing,則應用于id遞回結果。如果是Just x,則應用于(x:)遞回結果。用于maybe選擇正確的功能。
justifyList [] = []
justifyList (x:xs) = (maybe id (:) x) (justifyList xs)
maybe id (:) Nothing == idmaybe id (:) (Just x) == (x:).
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/452125.html
