列表中的isContain函数

时间:2018-12-09 19:36:22

标签: haskell

我正在尝试在Haskell中实现isContain函数,以下是我的代码

isContain :: Char -> Bool

isContain  x = if x== b then True else isContain   x where (b:bs) = ['a'..'z']

我的代码变得无限,因为b的值从未改变。如何更改它,以使其更改b的值。请让我知道如何进行迭代。

我还有其他想法可以实现该功能,但出于学习目的,我想这样做。

2 个答案:

答案 0 :(得分:3)

您确实可以通过实施

解决问题
isContain :: [Char] -> Char -> Bool
isContain []     _ = False
isContain (b:bs) x = ...

传递一个字符列表作为参数,并在每个步骤中从列表顶部放一个字符。但是您不需要。

类型Char具有类Ord的实例,这意味着您可以比较字符。因此,您所需要做的就是检查您的x是否在az之间

isContain :: Char -> Bool     
isContain  x = (x>='a') && (x<='z')

最后请注意,此功能已在模块Data.Char中存在。

isAsciiLower :: Char -> Bool

答案 1 :(得分:1)

您需要将更新的列表(其尾部)传递给递归调用。如果要保留现有签名,仍然可以在where子句中定义一个嵌套函数:

contains x = cont ['a'..'z'] 
  where cont [] = False
        cont (b:bs) = if x == b then True else cont bs