如何列出其他列表的列表?

时间:2016-08-23 12:35:01

标签: haskell

我试图让列表包含几个较小的列表,并将每个子列表的第一个元素加倍。这是我的代码:

 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

任何人都可以帮助我吗?

2 个答案:

答案 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