这是我的任务: 写一个函数:
onlyDigits :: String -> String
从字符串中删除所有非数字字符(例如,onlyDigits“ac245d62” 是“24562”)。
我有这个:
onlyDigits :: String -> String
onlyDigits a = [ (not)isAlpha b | b <- a ]
但是我无法编译它
谁能看到我出错的地方?
答案 0 :(得分:4)
写作
(not) isAlpha b
您将not
应用于两个参数isAlpha
和b
,这可能是编译器抱怨的原因。
如果你解决了这个小错误,现在写下来:
onlyDigits :: String -> String
onlyDigits a = [ not (isAlpha b) | b <- a ]
你仍会收到错误,因为这会创建一个Bool
s!
你可能想要的是:
onlyDigits :: String -> String
onlyDigits a = [ b | b <- a, not $ isAlpha b ]
这将使b
的所有元素a
符合条件not (isAlpha b)
。
您还可以使用filter
函数并具有无点函数:
onlyDigits :: String -> String
onlyDigits = filter (not.isAlpha)
甚至更好:
onlyDigits :: String -> String
onlyDigits = filter isDigit
只保留数字!
答案 1 :(得分:1)
你实际上有2个错误。
第一个是类型错误,源于没有正确使用函数应用程序。
但第二个问题是,如果您只过滤一类不需要的字符,那么您的功能仍然无法执行您想要的功能。例如,您也不需要空格字符。或图形符号。
有时候,最好说“我想要这个”而不是“除了......(长列表)我想要的东西”。 因此,过滤所需的属性,而不是否定您不想要的属性之一。