Haskell 过滤一个以上的字符
Haskell filter more than one char
我有一个问题。我这里有这行代码。
map length [filter (/= ' ') someString]
我知道它从 someString 中删除了 space。但是是否可以使用过滤器从字符串中删除的不仅仅是 space ?假设删除 spaces 和其他一些字符。
谢谢!
你可以这样做:
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.Char
的 isLetter
函数。
另一种方法是使用折叠来获取长度,如果您实际上不需要 return 过滤后的字符串而只需要它的长度。
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]
一个稍微短一点的方法是使用notElem
:
λ> filter (flip notElem " f") "foo bar"
"oobar"
我有一个问题。我这里有这行代码。
map length [filter (/= ' ') someString]
我知道它从 someString 中删除了 space。但是是否可以使用过滤器从字符串中删除的不仅仅是 space ?假设删除 spaces 和其他一些字符。
谢谢!
你可以这样做:
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.Char
的 isLetter
函数。
另一种方法是使用折叠来获取长度,如果您实际上不需要 return 过滤后的字符串而只需要它的长度。
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]
一个稍微短一点的方法是使用notElem
:
λ> filter (flip notElem " f") "foo bar"
"oobar"