【问题标题】:Check if a string contains a certain character检查字符串是否包含某个字符
【发布时间】:2015-08-24 15:23:11
【问题描述】:

我需要检查我的字符串是否包含特定字符。

我试过这个:

charFound :: Char -> String -> Bool
charFound c s = filter(\x -> x == c) s

但它给了我:

无法将预期类型 Bool 与实际类型 [Char] 匹配

我知道那个过滤器:

返回一个列表,该列表由满足第一个参数给定条件的列表(第二个参数)的成员构成。

我怎样才能达到目标并返回布尔值而不是列表?

【问题讨论】:

  • 使用前奏中的函数elem :: Eq a => a -> [a] -> Bool。
  • 查看我的更新答案,了解实现此功能的简单方法。

标签: haskell


【解决方案1】:

出于您的目的,您可以使用 prelude 中的函数elem :: Eq a => a -> [a] -> Bool。它完全按照标签上的说明进行操作。为了实现这个功能,我会使用这样的东西:

elem = any . (==)

甚至更初级:

elem x = foldr ((||) . (x ==)) False

请注意,由于(||) 的短路行为,只要找到x,这也适用于无限列表。

【讨论】:

  • 我不确定你做了什么(我是 Haskell 的菜鸟)。我所做的是charFound c s = c elem s 和工作;s
  • 您的文字有点乱码,但您基本上可以将charFound 实现为charFound c s = elem c s 甚至charFound = elem。
【解决方案2】:

filter 的类型是(a -> Bool) -> [a] -> [a]。

您提供了类型为Char -> Bool 的第一个参数(正确),然后提供了正确的第二个参数String(即[Char]),因此filter (\x -> x == c) s 的类型为@987654328 @。

但是您提供的类型签名表明该函数返回一个Bool,它与返回的实际类型不匹配。

您可能想要使用any 而不是filter。它的类型是(a -> Bool) -> [a] -> Bool。


还有一个all 函数,当且仅当列表的所有元素都满足传递的谓词时才返回True。您还可以考虑给定[Bool] 的函数or 和and 计算值的析取或合取。所以any f = or . map f 和all f = and . map f。

对于所有与列表相关的函数,请参见 Data.List 模块。

【讨论】:

    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 2014-05-07
    • 2011-03-31
    • 2019-08-05
    • 2015-03-15
    • 2018-05-01
    • 1970-01-01
    相关资源
    最近更新 更多