2014-09-27 32 views
0
halveEvens :: [Int] -> [Int] 
halveEvens xs = [if xs == even then 'div' 2 xs | x<-xs] 

嘿我想寫下一些代碼在haskell這將從列表中除去他們並將它們除以二。我對此很新,所以我遇到了一些麻煩。有沒有人能讓我走上正軌?我想用列表理解來達到這個目的!列表除以2的列表

+1

「我想用列表理解實現這個」使得這看起來像家庭作業......這就是說,讓我指出,在Haskell中,「if」需要'then'和'else',你也是當你真的需要使用元素時,使用'|'左側的完整列表'xs',並且應該查看'和反引號之間的區別,以及使用反引號創建的運算符的位置。 – jamshidh 2014-09-27 21:22:46

+0

你也許應該有一個輔助函數......爲什麼你需要它與列表理解? – Arnon 2014-09-27 21:49:25

+1

你近了,剛剛閱讀了關於[list comprehension](http://www.haskell.org/haskellwiki/List_comprehension)的語法,尤其是。如何寫警衛。 – 2014-09-28 10:29:50

回答

3

在您的功能xs是一個列表even is a function,檢查Integral是否是偶數。

要使用像運算符這樣的函數,可以用下面的引號括起來:x `div` 2

halveEvens :: [Int] -> [Int] 
halveEvens = map halveOneEven 

halveOneEven :: Int -> Int 
halveOneEven x = if (even x) then (x `div` 2) else x 
0

使用列表理解與保護逗號後:

halveEvens xs = [x `div` 2 | x<-xs, even x] 

你可以把它讀作一個數學上的定義:採取一切x值從xs是偶數,並收集將它們的結果列入清單。在ghci中,您可以使用:t檢查類型並使它們匹配(xs類型爲[Int],xInt,並且even(Integral a) => a -> Bool)。