2016-10-05 47 views
3

我剛剛進入Haskell,並且我正在嘗試創建一個函數,給出一個數字列表將返回其中所有負數的列表。 所以我做了這個當列表參數有多個元素時,Haskell得到錯誤

negative:: [Int] -> [Int] 

negative [x] = [z | z <- [x], x < 0] 

當我嘗試它只有一個列表中的元素它的作品,因爲它應該

負[-1]返回[-1]

負[1]返回[]

然而,當我添加更多的號碼,如例如 負[0,-1]我得到以下錯誤:

臨gram error:pattern match failure:negative [Num_fromInt instNum_v30 0,Num_fromInt instNum_v30 -1]

我試着用空格和空格之間沒有空格鍵入數字,但結果相同。我猜測我的代碼有問題,但是因爲我仍然習慣了Haskell,所以我很難找到它。任何幫助將不勝感激。

+0

這個錯誤在SO上很常見。我想知道是否有某些課程/教程在某處使用'[x]'作爲任意列表的符號,而不是單例列表。 – chi

回答

3

只是x替換表達式的左手側的[x],改變表達x < 0z < 0(請記住,我們篩選出單個元件,而不是容器本身)。

這裏是我會怎麼做:

negative :: [Int] -> [Int] 
negative x = [z | z <- x, z < 0] 

(可選)這裏是你如何能使用高階函數解決同樣的問題:

negative :: [Int] -> [Int] 
negative xs = filter (< 0) xs 

(如果你不不知道高階函數是什麼,只是忽略了前面的例子,當你走的時候你會了解它們的)