2017-09-23 10 views
0

私はhaskellでsum関数を作成しようとしています。私は言語にもっと慣れるためにこれをやっています。ハスケル - どこでパターンマッチングを理解しているのですか?

mysum :: [Integer] -> Integer 
mysum lst = sm lst 
    where 
    sm :: [Integer] -> Integer 
    sm lst [] = 0 
    sm lst [x:xs]= 
     x + sm xs 

アイデアがリストの先頭の値を返すようにした、+テールバック関数に送ら:私はそれを定義しました。私はF#で何か似たようなことを思い出しますが、私は単にそれをハズケで働くことはできません。

The error im getting is: 
sum.hs:5:5: error: 
    • Couldn't match expected type ‘Integer’ 
        with actual type ‘[[Integer]] -> Integer’ 
    • The equation(s) for ‘sm’ have two arguments, 
     but its type ‘[Integer] -> Integer’ has only one 
     In an equation for ‘mysum’: 
      mysum lst 
      = sm lst 
      where 
       sm :: [Integer] -> Integer 
       sm lst [] = 0 
       sm lst [x : xs] = x + sm xs 
    | 
5 |  sm lst [] = 0 
    |  ^^^^^^^^^^^^^... 

答えて

7
sm :: [Integer] -> Integer 
    -- ^^^^^^^^^ one argument 
sm lst [] = ... 
-- ^^^ ^^ two arguments 
sm lst [x:xs]= ... 
-- ^^^ ^^^^^^ two arguments 

あなたは他の引数にlst、とだけパターンマッチを削除する必要があります。

さらに、(x:xs)は角括弧を使用しません。パターン[x:xs]は、要素が空でないリストx:xsである単一要素のリストと一致します。リストのリストと一致させたくありません。

可能修正はそのためです。

mysum :: [Integer] -> Integer 
mysum lst = sm lst 
    where 
    sm :: [Integer] -> Integer 
    sm [] = 0 
    sm (x : xs) = x + sm xs 

上記の冗長性があります:mysumと同じことを行うsmが!したがって、補助定義を削除することができます。

mysum :: [Integer] -> Integer 
mysum []  = 0 
musum (x : xs) = x + mysum xs 
関連する問題