2013-02-17 9 views
0

給定一個數字列表,我想創建一個新列表,其索引爲i 之前的所有i-1元素的總和。SML - 使用原始列表的元素構建一個新列表 - 錯誤:運算符和操作數不同意[literal]

例如:

[1,4,6,9] -> [1,5,11,20] 

我已經寫了下面的代碼:

fun sum nil = 0 
| sum [x]=x 
| sum(x::rest)=(x+hd(rest))::sum(rest); 

,但我得到這個:

- fun sum nil = 0 
= | sum [x]=x 
= | sum(x::rest)=(x+hd(rest))::sum(rest); 
stdIn:306.16-306.39 Error: operator and operand don't agree [literal] 
    operator domain: int * int list 
    operand:   int * int 
    in expression: 
    x + hd rest :: sum rest 

我可以看到的(x+hd(rest))::sum(rest);遞歸規則是 問題的原因,但我該如何解決它?

Regards

回答

5

看看你的基本情況。你希望函數返回一個列表,所以基本情況應該返回列表。

fun sum []  = [] 
    | sum [x]  = [x] 
    | sum (x::xs) = ... 

[]更換nil,因爲我更好喜歡它 - 它其實並不重要。

另一件事 - 從來沒有使用hdtl運營商(有例外,但現在,就是不要)。當然,在你的職責中,這不會成爲一個問題,因爲你照顧到了情況,但還有另一個原因。如果你這樣做:

fun foo [] = ... 
    | foo (x::y::xs) = ... 

SML將告訴你,模式匹配並不詳盡,也就是有你錯過的模式,這意味着你趕上在編譯時錯誤,而不是在運行。

下面是您的功能的一個版本的作品。

fun sum [] = [] 
    | sum [x] = [x] 
    | sum (x::y::xs) = x::sum (x+y::xs) 

我感動除了遞歸調用,因爲如果添加的第一件事情,那麼結果的第一個元素將是加在一起的原始列表的第一元素。

相關問題