如何检查字符是否属于Haskell中的一组符号?

时间:2017-02-19 21:11:35

标签: list haskell

任务是计算字符串中的所有标点符号。如何检查角色是否属于该组"。,!?;:"。我是这样做的

signs' curSgn ('.':list) = (signs' (curSgn + 1) list)
signs' curSgn (',':list) = (signs' (curSgn + 1) list)
signs' curSgn ('?':list) = (signs' (curSgn + 1) list)
signs' curSgn ('!':list) = (signs' (curSgn + 1) list)
signs' curSgn (':':list) = (signs' (curSgn + 1) list)
signs' curSgn (';':list) = (signs' (curSgn + 1) list)

但有没有办法在一行代码中完成?

1 个答案:

答案 0 :(得分:5)

您可以使用filter提取您感兴趣的符号,并使用length计算出现次数。 Filter获取值列表并返回包含满足某些属性的值的最大子列表(例如,作为标点符号)。

punctuation :: String -> Int
punctuation s = length (filter (...) s)

...是什么?它需要判断一个字符是否是标点符号,即类型为Char -> Bool的谓词。如何判断角色是否在给定列表中?

isPunctuation :: Char -> Bool
isPunctuation c = c `elem` ['.', ',', '?', '!', ':', ';']

将这些放在一起

punctuation :: String -> Int
punctuation = length . filter (`elem` ".,?!:;")

请注意,字符['.', ...]列表实际上是一个字符串,您可以将其写为".,?!:;"。还要注意无点符号,而不是根据它对唯一参数punctuation的作用来定义s,我们说函数punctuation等于函数的组合{{1 }和length。另请注意section符号绑定filter ...的第二个参数而不是第一个参数。还有isPunctuation