[英]function that returns a list [0,[x1],[x1,x2],[x1,x2,x3]…] where [x1,x2,x3…] is the original list
[英]Flattening a list of Maybe elements from Just [[x1],[x2]] to Just [x1,x2]
我有一個我應該如此定義的函數:
func :: (a -> Maybe [b]) -> [a] -> Maybe [b]
它應該如何工作的一些例子:
func (\x -> if x == 0 then Nothing else Just [x]) [1,2]
應該導致:
只是[1,2]
另一個例子:
func (\x -> if x == 0 then Nothing else Just [x]) [1,0]
沒有
如果列表中的Nothing
都是Nothing
,則該函數返回Nothing
。 否則,如果列表中的所有元素都返回Just [x]
那么它應該返回一個列表: Just [x1, x2, ...]
。
我嘗試使用fmap
進行上面的類似調用,返回類似於:
[Just [1],Just [2],...]
如果我在fmap
返回的列表中使用sequence
,它將遵循上面的規則(如果列表中的Nothing
內容都是Nothing
則返回Nothing
),這很好。 除了它返回一個這樣的列表:
只是[[1],[2]]
這不是我需要的格式。 在那種情況下,我需要它:
只是[1,2]
當我剛剛開始學習Haskell並且monad對我來說仍然是一個新主題時,我在設置如何格式化此列表或者是否有更好的方法來解決此問題時遇到了一些麻煩。 我無法更改功能類型簽名。
要將[[1],[2]]
等列表轉換為[1,2]
,請使用concat
。 在你的情況下,由於列表在Maybe
,你需要在它上面調用fmap concat
。
另外,請注意,只要在map
, fmap
或<$>
的結果上調用sequence
(或sequenceA
),就可以通過將兩者組合到mapM
(或traverse
)中來保存函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.