将`lookup`返回的`Nothing`映射到默认值
假设我有一个l
类型列表[(Int, Integer)]
,其中每个元组中的第一个元素是i
范围0
to 中的(唯一)索引n
,每个元组中的第二个元素是一个关联值v
。
我想将此列表“扩展”为具有长度的l'
类型列表,以便所有in和if is not in 。[Integer]
10
l !! i == v
(i,v)
l
l !! 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
在这里不起作用。
上下文:我正在尝试在它们之间生成值的直方图0
并n
给出它们的列表,所以总的来说我到目前为止:
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必须是您想要的。