如果x在列表中,则返回true;否则返回False(递归)

时间:2020-08-14 08:15:29

标签: list haskell

我正在编写一个简短的递归函数,以列表作为输入并输出Bool。 (我是haskell初学者)到目前为止,我可以检测到第一个元素是否为3,但是我不确定如何使用递归检查列表的其余部分。

func :: [Int] -> Bool
func [] = False
func (x:xs)
  | (x == 3)           = True
  | otherwise          = False

1 个答案:

答案 0 :(得分:4)

我也是Haskell的新手。

对您的代码稍作更改,就可以将其重写为

func :: [Int] -> Bool
func [] = False
func (x:xs)
  | x == 3    = True
  | otherwise = func xs

解释:

  • 如果列表为空:没有3
  • 如果列表不为空:
    1. 如果head是3,那么我们有3
    2. 否则,我们应检查列表的其余部分,因此答案“ 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好运。