将`lookup`返回的`Nothing`映射到默认值

假设我有一个l类型列表[(Int, Integer)],其中每个元组中的第一个元素是i范围0to 中的(唯一)索引n,每个元组中的第二个元素是一个关联值v

我想将此列表“扩展”为具有长度的l'类型列表,以便所有in和if is not in 。[Integer]10l !! i == v(i,v)ll !! j == 0(j,_)l

IE: [(1,10),(6,7)] => [0,10,0,0,0,0,7,0,0,0]

我不知道该怎么做,我试过:

map (i -> lookup i l) [0..n]

除了结果是一个Maybe的列表之外,这是有效的。一个明显的解决方案是:

integerOrZero :: Maybe Integer -> Integer                                        
integerOrZero Nothing  = 0                                                       
integerOrZero (Just n) = n    

进而:

map integerOrZero $ map (i -> lookup i l) [0..n]

但我想知道是否有一种更简单的方法(可能是单行)来编写这个“默认查找”。我想mayMaybe在这里不起作用。

上下文:我正在尝试在它们之间生成值的直方图0n给出它们的列表,所以总的来说我到目前为止:

import Data.List (group, sort)

hist l = map integerOrZero $ map (i -> lookup i l') [0..n]
  where l' = map (x -> (head x, length x)) $ group $ sort l

我想尽可能简洁地使用base包中的函数来写这个。

回答

Data.Maybe.fromMaybe,经常被遗忘。

数据。也许

如果您使用Data.Map.Strict,则有更好的选择。findWithDefault必须是您想要的。


以上是将`lookup`返回的`Nothing`映射到默认值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>