2013-03-26 105 views
4

這可能是一個相當明顯的問題,但我無法弄清楚。Haskell均勻函數?

我想寫一個函數,將偶數編號在列表中。當我嘗試運行它時,出現關於使用偶函數的錯誤。我怎樣才能解決這個問題?

squareEvens n = [ns * ns | ns <- n, even ns] 

但是請注意,該公約是用複數來命名列表和奇異的名字從該列表中的元素:如果你改變even neven ns

module SquareEvens where 

squareEvens :: [Integer] -> [Integer] 

squareEvens n = [ns * ns | ns <- n, even n] 
+5

如果你把'even n'改成'even ns' – 2013-03-26 03:46:23

+0

yep!它固定它groovy!哇,呃。 – 2013-03-26 03:52:26

+21

在一個不相關的說明中,按照慣例'ns'通常表示一個列表,'n'表示該列表中的一個元素。你可能會考慮切換你的'n'和'ns'以遵循常見的Haskell用法。 – kputnam 2013-03-26 04:12:48

回答

11

的代碼工作正常。所以交換nns遵循慣用哈斯克爾用法:

squareEvens ns = [n * n | n <- ns, even n] 
7

正如你所看到的,很容易得到錯誤的變量名。那麼,爲什麼不這樣做呢?

squareEvens = map (^2) . filter even 

我覺得這比理解更清晰。你可以從右到左閱讀:只保留偶數,然後將它們平方。