2011-05-30 191 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 ]