任务是计算字符串中的所有标点符号。如何检查角色是否属于该组"。,!?;:"。我是这样做的
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)
但有没有办法在一行代码中完成?
答案 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
。