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