我正在尝试在Haskell中实现isContain
函数,以下是我的代码
isContain :: Char -> Bool
isContain x = if x== b then True else isContain x where (b:bs) = ['a'..'z']
我的代码变得无限,因为b
的值从未改变。如何更改它,以使其更改b
的值。请让我知道如何进行迭代。
我还有其他想法可以实现该功能,但出于学习目的,我想这样做。
答案 0 :(得分:3)
您确实可以通过实施
解决问题isContain :: [Char] -> Char -> Bool
isContain [] _ = False
isContain (b:bs) x = ...
传递一个字符列表作为参数,并在每个步骤中从列表顶部放一个字符。但是您不需要。
类型Char
具有类Ord
的实例,这意味着您可以比较字符。因此,您所需要做的就是检查您的x
是否在a
和z
之间
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