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个元素,我们如何获得它?
答案 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
将为1
而xs
将为[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 ]