问题描述
我正在编写一个简短的递归函数,以列表作为输入并输出Bool。 (我是haskell初学者)到目前为止,我可以检测到第一个元素是否为3,但是我不确定如何使用递归检查列表的其余部分。
func :: [Int] -> Bool
func [] = False
func (x:xs)
| (x == 3) = True
| otherwise = False
解决方法
我也是Haskell的新手。
对您的代码稍作更改,就可以将其重写为
func :: [Int] -> Bool
func [] = False
func (x:xs)
| x == 3 = True
| otherwise = func xs
解释:
- 如果列表为空:没有3
- 如果列表不为空:
- 如果head是3,那么我们有3
- 否则,我们应检查列表的其余部分,因此答案“ 3 in list”等效于“ x in xs”。
如果您接受一些更改,我可以建议使用OR(并在惰性评估的帮助下)实施。
func :: [Int] -> Bool
func [] = False
func (x:xs) = x==3 || func xs
它实际上与上面的代码相同,但是行数较少。
- 如果head为3,则返回True。
- 如果head不是3,请检查列表的其余部分。
最后,我想向您介绍elem
函数,它的作用是:获取元素和列表,如果a在列表中,则返回True,否则返回False。
这正是我们想要的,所以我写:
containsThree :: [Int] -> Bool
containsThree = elem 3
还请注意,我使用了无点样式,如果您不熟悉,则第二行与以下内容相同:
containsThree xs = elem 3 xs
祝你学习Haskell好运。