如何解决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 ]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。