Haskell否定函数

时间:2013-11-24 00:06:19

标签: haskell

这是我的任务: 写一个函数:

onlyDigits :: String -> String

从字符串中删除所有非数字字符(例如,onlyDigits“ac245d62” 是“24562”)。

我有这个:

onlyDigits :: String -> String
onlyDigits a = [ (not)isAlpha b | b <- a ]

但是我无法编译它

谁能看到我出错的地方?

2 个答案:

答案 0 :(得分:4)

写作

(not) isAlpha b

您将not应用于两个参数isAlphab,这可能是编译器抱怨的原因。

如果你解决了这个小错误,现在写下来:

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个错误。

第一个是类型错误,源于没有正确使用函数应用程序。

但第二个问题是,如果您只过滤一类不需要的字符,那么您的功能仍然无法执行您想要的功能。例如,您也不需要空格字符。或图形符号。

有时候,最好说“我想要这个”而不是“除了......(长列表)我想要的东西”。 因此,过滤所需的属性,而不是否定您不想要的属性之一。