我正在尝试编写一个函数来计算Haskell中超过1位数的字符串中的所有数字。
示例1:“Test1 Test12”
这应该返回1,因为只有“Test12”有超过1位数。
实施例2:“Test1 Test12 Test123”
这应该返回2,因为只有“Test12”和“Test123”有超过1位数。
这就是我的代码目前的样子:
import Data.Char
import Data.List
import Data.Function
digits = any ((1<) . length) . groupBy ((&&) `on` isDigit)
count :: String -> Int
count n = length (filter digits n)
有人可以帮我吗?
答案 0 :(得分:2)
您的问题可以分解为
因此,您要做的最基本的事情是计算单词中的位数。由于单词是一个字符串,可以通过
轻松完成count :: String -> Int
count word = length $ filter isDigit n
然后你想确定一个单词是否有多个数字,这意味着它应该返回Bool
:
hasManyDigits :: String -> Bool
hasManyDigits word = count word > 1
然后你想找到一个多位数的句子中的单词数:
wordsWithManyDigits :: String -> [String]
wordsWithManyDigits sentence = filter hasManyDigits $ words sentence
然后你要数数呢
countWordsWithManyDigits :: String -> Int
countWordsWithManyDigits sentence = length $ wordsWithManyDigits sentence
words
函数在空格上拆分字符串,我认为Data.Char.isDigit
函数非常明显。
您可以将这些组合成一个单独的功能
count :: String -> Int
count = length . filter ((> 1) . length . filter isDigit) . words
但我认为这会让它失去可读性,即使它显示了Haskell能够很好地编写函数的能力。