Haskell列表理解

时间:2011-05-30 05:27:53

标签: haskell

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)的作用。它是 xs 列表的 X 元素吗?'

如果我们想获得列表的第n个元素,我们如何获得它?

4 个答案:

答案 0 :(得分: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],则x将为1xs将为[2,3]

问题3:如果我们想获得列表中的第n个元素如何获取它?

执行此操作的常用方法是使用!!函数 - 它是有效的,也就是说,您提供左对齐和右对齐的参数,就像您对+或{{1 }}。例如,*将返回[1,2,3]!!1


现在,如果这有助于澄清事情,您应该注意到您的函数定义存在一些问题。我不确定你是否愿意自己解决这些问题。

答案 1 :(得分: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

要从列表中n获取xs haskell语法

xs !! n

示例

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

下次遇到问题时,请参阅Some Common (and not so common!) Hugs Errors

答案 2 :(得分:1)

嗯,他们正确地回答你了,但无论如何我会告诉你他们没有的事情:P

  

问题2:(x:xs)是什么意思?

Haskell中的列表是由: HEAD + TAIL,其中HEAD是第一个元素,TAIL是其他元素。

  

“head [1,2,3]”将返回1

     

“tail [1,2,3]”将返回[2,3]

但是还有其他功能:

  

“init [1,2,3]将返回[1,2]   “最后[1,2,3]将返回3

如果您是从Haskell开始,请检查this

PS:抱歉我的英语不好!

答案 3 :(得分: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 ]