Haskell 列表中的isContain函数

Haskell 列表中的isContain函数,haskell,Haskell,我试图在Haskell中实现isContain函数,下面是我的代码 isContain :: Char -> Bool isContain x = if x== b then True else isContain x where (b:bs) = ['a'..'z'] 我的代码是无限的,因为b的值永远不会改变。如何更改它,使其更改b的值。请让我知道如何使其重复 我有其他的想法来实现这个功能,但我想这样做是为了学习 您需要将更新后的列表(其尾部)传递给递归调用。如果要保留现有签名

我试图在Haskell中实现
isContain
函数,下面是我的代码

isContain :: Char -> Bool

isContain  x = if x== b then True else isContain   x where (b:bs) = ['a'..'z']
我的代码是无限的,因为
b
的值永远不会改变。如何更改它,使其更改
b
的值。请让我知道如何使其重复


我有其他的想法来实现这个功能,但我想这样做是为了学习

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

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

您确实可以通过实施

isContain :: [Char] -> Char -> Bool
isContain []     _ = False
isContain (b:bs) x = ...
将字符列表作为参数传递,并在每一步从列表顶部删除一个字符。但是你不需要

类型
Char
具有类
Ord
的实例,这意味着您可以比较字符。因此,您只需检查
x
是否介于
a
z

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

您应该使用字母表中的其余值实现递归函数。这意味着您需要递归地将变量
bs
传递给调用。@ThomasM.DuBuisson为此,我必须更改值函数签名。还有其他可能的方法吗?结束循环:您已经看到并接受了一个答案,即建议不需要更改您的类型签名。具体来说,可以使用一个helper函数,该函数在值列表上递归,
['a'..'z']
。这听起来不错,但我不想更改类的定义。这里没有任何内容可以更改类的定义。这是说,你可以使用带有字符的不等式运算符(即
=
请你举例说明一下,我不知道我应该把`contains x=cont['a'..'z']放在哪里。@MuhammadUsman我刚刚把
isContain
重命名为
contains
,听起来更正确。
isAsciiLower :: Char -> Bool