這是我的任務: 寫一個函數:哈斯克爾否定功能
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