Haskell 列表中的isContain函数
我试图在Haskell中实现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的值。请让我知道如何使其重复 我有其他的想法来实现这个功能,但我想这样做是为了学习 您需要将更新后的列表(其尾部)传递给递归调用。如果要保留现有签名
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