2011-05-30 56 views
3
sum1::[Int]->[Int] 
sum1 [] =0 
sum1 (x:xs) = [x|x<-xs,x `mod` 2 ==0] 

我需要2將提供一份清單時,返回的是整除的數字,但上面的代碼給了我這個編譯錯誤:哈斯克爾列表理解

Instance of Num [Int] required for definition of sum1 

還請解釋一下(x:xs)呢。是'X元素xs列表?'

如果我們想獲得列表的第n個元素,我們如何得到它?

回答

15

你已經問了幾個問題,所以我會一一回答。

問題1:爲什麼編譯器告訴我Instance of Num [Int] required for definition of sum1

您已經創建了一個名爲sum1的函數,其類型爲[Int]->[Int]。但是,考慮行sum1 [] = 0:這返回Int,而不是[Int]。解決此問題的方法是將行更改爲sum1 [] = []

問題2:(x:xs)是什麼意思?

Haskell允許您執行一些稱爲pattern matching的操作。由於有很多更好的解釋,因此有很多更好的解釋,結果是x是列表中的第一個元素,xs是列表的其餘部分 - 也就是說,您已經剝離了第一個元素名單。

例如,如果你叫sum1 [1,2,3]x1xs[2,3]

問題3:如果我們想獲得列表的第n個元素如何得到它?

一種常見的方式做,這是使用!!功能 - 這是infixed,那就是,你同時提供左,右參數,就像你會爲+*。例如,[1,2,3]!!1將返回2


現在,如果這有助於澄清事情,您應該注意到您的函數定義有一些問題。我不確定你是否想要自己解決這些問題。

+0

感謝它解決了所有probs :) – Sudantha 2011-05-30 05:46:02

+0

感謝信oftz爲使它看起來漂亮:-)我同意你的編輯。 – erisco 2011-05-30 05:48:55

+0

+1每個問題的簡單答案+1。 – 2011-05-30 19:35:59

1
sum1::[Int]->[Int] 
sum1 [] = [0] // problem here 
sum1 (x:xs) = [x| x <- xs ,x `mod` 2 == 0] 

sum1必須返回[Int]但在這種情況下,它僅返回Int

(x:xs)匹配列表的模式會將列表的第一個元素放置在x中,並將列表的其餘部分放入xs

如果你想sum1從提供你需要改變你的代碼

sum1::[Int]->[Int] 
sum1 [] = [0] // problem here 
sum1 xs = [x| x <- xs ,x `mod` 2 == 0] 

因爲,當前的代碼將跳過列表的第一個元素列表返回所有偶數。嘗試使用[2..10]作爲輸入。在輸出列表中不會看到2

要從列表xs Haskell語法得到n個元素是

xs !! n 

*Main> [1..10] !! 5 
6 

你遇到麻煩下次見Some Common (and not so common!) Hugs Errors

1

那麼,他們正確地回答你,但不管怎樣,我要告訴你的東西,他們沒有: HEAD + TAIL,其中HEAD是:P

Question 2: what does (x:xs) mean?

Haskell中列出了由第一個元素和TAIL是其他元素。

"head [1,2,3]" will return 1

"tail [1,2,3]" will return [2,3]

但也有另一種功能,反正:

"init [1,2,3] will return [1,2] "last [1,2,3] will return 3

如果你開始在Haskell中,檢查this

PS:對不起,我的英語不好!

1

你不需要使用列表理解的anker!

sum1 = \xs -> [ x | x <- xs, mod x 2 == 0] 

第n個元素的問題的另一個解決方案:

nth_elem = \n xs -> head $ [ x | (id,x) <- zip [1..] xs, id == n ]