Haskell列表理解

Sud*_*ha 3 haskell

sum1::[Int]->[Int]
sum1 [] =0
sum1 (x:xs) = [x|x<-xs,x `mod` 2 ==0]
Run Code Online (Sandbox Code Playgroud)

我需要返回在提供列表时可被2整除的数字,但上面的代码给出了这个编译错误:

 Instance of Num [Int] required for definition of sum1
Run Code Online (Sandbox Code Playgroud)

还请解释一下(x:xs).它是' xs list 的X元素吗?'

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

eri*_*sco 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,2,3]!!1将返回2.


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