【问题标题】:Haskell filter more than one charHaskell 过滤多个字符
【发布时间】:2015-01-20 10:55:46
【问题描述】:

我有一个问题。我这里有这行代码。

map length [filter (/= ' ') someString]

我知道它会从 someString 中删除空间。但是是否可以使用过滤器从字符串中删除更多的空间?让我们说删除空格和其他一些字符。

谢谢!

【问题讨论】:

  • map length [filter (/= ' ') someString] - 这可以编译吗?
  • @shree.pat18 确实如此,但如果我没记错的话,它总是会返回[<length of non space chars>]。相当于return . filter (/= ' ') someString :: [Int]
  • @ThreeFx 我的错,错过了空间并得到了解析错误。但它不会总是返回 [1]。
  • 是的,它会返回非空格字符的长度。但我希望删除一些其他字符,例如 !等等。
  • @user4274735 你为什么使用map lengthfilter 将返回字符串就好了。

标签: haskell


【解决方案1】:

你可以这样做:

filter (not . flip elem "<your chars here>")

例子:

ghci> filter (not . flip elem " .,") "This is an example sentence, which uses punctuation."
"Thisisanexamplesentencewhichusespunctuation"

只是把评论放在这里:要过滤掉两种情况下的字母(a-z 和 A-Z),您可能应该使用Data.CharisLetter 函数。

【讨论】:

  • 感谢您的帮助!是否可以使用翻转添加一系列字符,例如 a-Z?
  • @user4274735 只需使用Data.CharisLetter 即可。
  • 我希望你不介意我问这个问题,但是使用 isLetter 会是什么样子?
  • @user4274735 isLetter x 如果 x 是字母则返回 True,否则返回 False。要反转它,只需使用not . isLetter
  • 好吧,谢谢我使用了 like: map length [filter (isLetter) someString] 再次感谢!
【解决方案2】:

稍微短一点的方法是使用notElem

λ> filter (flip notElem " f") "foo bar"
"oobar"

【讨论】:

    【解决方案3】:

    如果您实际上不需要返回过滤后的字符串而只需要它的长度,则另一种方法是使用折叠来获取长度。

    f x charlist = foldl (\acc x -> if not $ x `elem` charlist then acc + 1 else acc) 0 x
    

    charlist 是您的禁用字符列表。如果你总是有一个固定的列表,你可以直接将它定义为顶级值并在函数体中使用它,而不是将它作为参数传递。

    使用列表推导的更简洁的版本:

    f x = length [z | z <- x, notElem z charlist]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 2020-09-04
      • 2014-11-20
      • 2021-12-09
      相关资源
      最近更新 更多