2013-11-24 43 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個錯誤。

第一個是類型錯誤,源於未正確使用函數應用程序。

但第二個是你的功能仍然不會做你想做的,如果你只過濾一類不需要的字符。例如,你也不需要空格字符。或圖形符號。

有時候,最好說「我想要這個」而不是「我想要什麼,但...(長列表)」。 因此,篩選你想要的財產,而不是否定你不想要的財產之一。