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 list的X元素吗?\' 如果我们想获得列表的第n个元素,我们如何得到它?     

解决方法

        您已经问了几个问题,所以我将一一解答。 问题1:为什么编译器会告诉我“ 3”? 您已经创建了一个名为
sum1
的函数,类型为
[Int]->[Int]
。但是,请考虑行
sum1 [] = 0
:这将返回
Int
,而不是
[Int]
。解决此问题的方法是将行更改为“ 9”。 问题2:(
x:xs
)是什么意思? Haskell允许您执行称为“ 11”的操作。无需过多赘述,因为有很多更好的解释,结果是
x
是列表的第一元素,
xs
是列表的其余元素-也就是说,您已经剥离了名单。 例如,如果您呼叫
sum1 [1,2,3]
,则
x
将为
1
,而
xs
将为
[2,3]
。 问题3:如果要获取列表的第n个元素,该如何获取? 常用的方法是使用
!!
函数-是固定的,即,您提供argument20或
*
时都需要左右参数。例如,
[1,3]!!1
将返回
2
。 现在,如果这有助于澄清问题,您应该注意到函数定义存在一些问题。我不确定您是否要自己解决这些问题。     ,        
sum1::[Int]->[Int]
sum1 [] = [0] // problem here 
sum1 (x:xs) = [x| x <- xs,x `mod` 2 == 0]
sum1
必须返回
[Int]
,但是在这种情况下,它仅返回return7ѭ。 与列表中的
(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语法中获得第35个元素,请执行以下操作:
xs !! n
*Main> [1..10] !! 5
6
下次遇到麻烦时,请查看一些常见(但不太常见!)拥抱错误。     ,        好吧,他们回答正确了,但是无论如何我都会告诉你他们没有的事情:P   问题2:(x:xs)是什么意思? Haskell中的列表由以下人员组成: HEAD + TAIL,其中HEAD是第一个元素,而TAIL是其他元素。   \“ head [1,3] \”将返回1      \“ tail [1,3] \”将返回[2,3] 但是无论如何,还有其他功能:   \“ init [1,3]将返回[1,2]   \“最后[1,3]将返回3 如果您从Haskell开始,请检查此 PS:对不起,我的英语不好!     ,        您不需要使用列表理解就可以做到!
sum1 = \\xs -> [ x | x <- xs,mod x 2 == 0]
第n个元素问题的另一个解决方案:
nth_elem = \\n xs -> head $ [ x | (id,x) <- zip [1..] xs,id == n ]