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個元素,我們如何得到它?
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個元素,我們如何得到它?
你已經問了幾個問題,所以我會一一回答。
問題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]
,x
將1
和xs
將[2,3]
。
問題3:如果我們想獲得列表的第n個元素如何得到它?
一種常見的方式做,這是使用!!
功能 - 這是infixed,那就是,你同時提供左,右參數,就像你會爲+
或*
。例如,[1,2,3]!!1
將返回2
。
現在,如果這有助於澄清事情,您應該注意到您的函數定義有一些問題。我不確定你是否想要自己解決這些問題。
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
那麼,他們正確地回答你,但不管怎樣,我要告訴你的東西,他們沒有: 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:對不起,我的英語不好!
你不需要使用列表理解的anker!
sum1 = \xs -> [ x | x <- xs, mod x 2 == 0]
第n個元素的問題的另一個解決方案:
nth_elem = \n xs -> head $ [ x | (id,x) <- zip [1..] xs, id == n ]
感謝它解決了所有probs :) – Sudantha 2011-05-30 05:46:02
感謝信oftz爲使它看起來漂亮:-)我同意你的編輯。 – erisco 2011-05-30 05:48:55
+1每個問題的簡單答案+1。 – 2011-05-30 19:35:59