我试图让列表包含几个较小的列表,并将每个子列表的第一个元素加倍。这是我的代码:
double_the_first::(Num a)=>[[a]]->[a]
double_the_first list = case list of
[] ->[]
[[x]] ->[x*2]
[x:xs] ->map(*2)(map(head)[x:xs])
我如何表示像[[2,3],[4,5]]这样的列表?我知道我的代码是错的,但是haskell没有显示任何错误,怎么样?当我输入这样的列表时,它将无法工作:
double_the_first [[2,3],[2,4],[4,3]]
*** Exception: test.hs:(3,25)-(6,51): Non-exhaustive patterns in case
任何人都可以帮助我吗?
答案 0 :(得分:7)
首先编写一个函数,对列表的每个元素执行您想要的操作。在您的情况下,每个元素本身就是一个列表。
doubleFirst :: Num a => [a] -> [a]
doubleFirst [] = []
doubleFirst (x:xs) = (2*x:xs)
然后使用map
将该函数应用于元素列表:
map doubleFirst [[2,3],[2,4],[4,3]]
答案 1 :(得分:1)
当列表为空时,您会遗漏某些情况。您可以按照以下方式更改代码。我添加了列表为空的可能性。我想你想要使用不同类型的结果。
double_the_first::(Num a)=>[[a]]->[[a]]
double_the_first list = case list of
[] -> []
(([]):xs) -> [[]] ++ double_the_first xs
((y:ys):xs) -> [(2*y:ys)] ++ double_the_first xs