这是我的任务: 写一个函数:哈斯克尔否定功能
onlyDigits :: String -> String
从字符串剥离所有非数字字符(例如,onlyDigits“ac245d62” 是“24562”)。
我有这样的:
onlyDigits :: String -> String
onlyDigits a = [ (not)isAlpha b | b <- a ]
但我不能编译它
任何人都可以看到我已经错了吗?
这是我的任务: 写一个函数:哈斯克尔否定功能
onlyDigits :: String -> String
从字符串剥离所有非数字字符(例如,onlyDigits“ac245d62” 是“24562”)。
我有这样的:
onlyDigits :: String -> String
onlyDigits a = [ (not)isAlpha b | b <- a ]
但我不能编译它
任何人都可以看到我已经错了吗?
通过编写
(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 ]
这将需要b
的a
所有元素,那些符合条件not (isAlpha b)
。
您也可以使用filter
功能,并有一个免费的点对点功能:
onlyDigits :: String -> String
onlyDigits = filter (not.isAlpha)
甚至更好:
onlyDigits :: String -> String
onlyDigits = filter isDigit
只保留数字!
好的非常感谢非常感谢 – Rob
你实际上有2个错误。
第一个是类型错误,源于未正确使用函数应用程序。
但第二个是你的功能仍然不会做你想做的,如果你只过滤一类不需要的字符。例如,你也不需要空格字符。或图形符号。
有时候,最好说“我想要这个”而不是“我想要什么,但...(长列表)”。 因此,筛选你想要的财产,而不是否定你不想要的财产之一。
看这里:https://www.fpcomplete.com/school/starting-with-haskell/basics-of-haskell/function-application – Ingo