2016-08-23 6 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

ありがとう、私の機能は今すぐ仕事です。しかし、あなたの2番目のケースについて説明することはできますか?私はそれを削除しようとし、コードはまだ適切に動作します。 – kkkjjj

+0

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

関連する問題