2016-08-23 29 views
1

我試圖做一個列表包含多個較小的列表,每個sub-lists.Here的第一個元素翻一番是我的代碼:如何製作由其他列表組成的列表?

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

啓用與'-Wall'標誌警告:它會幫助你發現許多常見的錯誤,包括不考慮所有可能的情況下,如上面的代碼段。 – chi

回答

7

首先寫一個函數,對列表中的每個元素進行操作。就你而言,每個元素本身就是一個列表。

doubleFirst :: Num a => [a] -> [a] 
doubleFirst [] = [] 
doubleFirst (x:xs) = (2*x:xs) 

然後使用map該功能適用​​於元素的列表:

map doubleFirst [[2,3],[2,4],[4,3]] 
+0

一個聰明的方法來解決XD – kkkjjj

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 
+0

謝謝,我的功能是現在的工作。但是,你能解釋一下你的第二種情況嗎?我試圖刪除它,代碼仍然正常工作。 – kkkjjj

+0

@Jerry試試'double_the_first [[],[1,2,3],[4,5,6]]' – chi

相關問題