我试图在Haskell中实现 isContain 函数,以下是我的代码
isContain
isContain :: Char -> Bool isContain x = if x== b then True else isContain x where (b:bs) = ['a'..'z']
我的代码无限,因为 b 的值永远不会改变 . 如何更改它以便更改 b 的值 . 请让我知道如何迭代 .
b
我有其他想法来实现这个功能,但我想这样做是为了学习目的 .
您确实可以通过实施来解决您的问题
isContain :: [Char] -> Char -> Bool isContain [] _ = False isContain (b:bs) x = ...
传递一个字符列表作为参数,并在每一步从列表顶部删除一个字符 . 但你不需要 .
类型 Char 具有类 Ord 的实例,这意味着您可以比较字符 . 所以你需要的是检查 x 是否在 a 和 z 之间
Char
Ord
x
a
z
isContain :: Char -> Bool isContain x = (x>='a') && (x<='z')
最后请注意,此函数已存在于模块 Data.Char 中 .
Data.Char
isAsciiLower :: Char -> Bool
您需要将更新的列表(其尾部)传递给递归调用 . 如果要保留现有签名,仍可以在 where 子句中定义嵌套函数:
where
contains x = cont ['a'..'z'] where cont [] = False cont (b:bs) = if x == b then True else cont bs
2 回答
您确实可以通过实施来解决您的问题
传递一个字符列表作为参数,并在每一步从列表顶部删除一个字符 . 但你不需要 .
类型
Char
具有类Ord
的实例,这意味着您可以比较字符 . 所以你需要的是检查x
是否在a
和z
之间最后请注意,此函数已存在于模块
Data.Char
中 .您需要将更新的列表(其尾部)传递给递归调用 . 如果要保留现有签名,仍可以在
where
子句中定义嵌套函数: