2017-09-23 86 views
0

我試圖在haskell中創建一個sum函數。我這樣做是爲了更熟悉這門語言。我定義它如下:Haskell - 瞭解何處和模式匹配

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

這個想法是返回列表頭部的值,+尾部反饋到函數中。我記得在F#中做了類似的事情,但我不能讓它在haskell中工作。

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 

上面有冗餘:mysumsm做同樣的事情!所以,我們可以刪除輔助定義。

mysum :: [Integer] -> Integer 
mysum []  = 0 
musum (x : xs) = x + mysum xs