假设我有一个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]
Run Code Online (Sandbox Code Playgroud)
除了结果是一个Maybe的列表之外,这是有效的。一个明显的解决方案是:
integerOrZero :: Maybe Integer -> Integer
integerOrZero Nothing = 0
integerOrZero (Just n) = n
Run Code Online (Sandbox Code Playgroud)
进而:
map integerOrZero $ map (\i -> lookup i l) [0..n]
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一种更简单的方法(可能是单行)来编写这个“默认查找”。我想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
Run Code Online (Sandbox Code Playgroud)
我想尽可能简洁地使用base包中的函数来写这个。