2013-11-24 44 views
2

这是我的任务: 写一个函数:哈斯克尔否定功能

onlyDigits :: String -> String 

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

我有这样的:

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

但我不能编译它

任何人都可以看到我已经错了吗?

+0

看这里:https://www.fpcomplete.com/school/starting-with-haskell/basics-of-haskell/function-application – Ingo

回答

4

通过编写

(not) isAlpha b 

你申请not到两个参数​​和b,这可能是为什么编译器会抱怨。

如果修复这个小错误,写信:

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

你还是会得到一个错误,因为这创造了Bool个清单!


你可能想要的是:

onlyDigits :: String -> String 
onlyDigits a = [ b | b <- a, not $ isAlpha b ] 

这将需要ba所有元素,那些符合条件not (isAlpha b)

您也可以使用filter功能,并有一个免费的点对点功能:

onlyDigits :: String -> String 
onlyDigits = filter (not.isAlpha) 

甚至更​​好:

onlyDigits :: String -> String 
onlyDigits = filter isDigit 

只保留数字!

+0

好的非常感谢非常感谢 – Rob

1

你实际上有2个错误。

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

但第二个是你的功能仍然不会做你想做的,如果你只过滤一类不需要的字符。例如,你也不需要空格字符。或图形符号。

有时候,最好说“我想要这个”而不是“我想要什么,但...(长列表)”。 因此,筛选你想要的财产,而不是否定你不想要的财产之一。