2016-11-04 85 views
0

我已經寫了以下函數來查找輸入數字的倍數。 當我嘗試給出負數時,輸出僅爲正數列表。如何修改我的代碼以允許在輸出中列出負數?使用Haskell的數字的倍數

我嘗試:

multiples n = if n<0 then result1 else result2 
where 
    result1 = [x | x <- [0..], x `mod` (-n) == 0]   
    result2 = [x | x <- [0..], x `mod` n == 0] 

    Input : take 5 $ multiples (-3) 
    Output: [0,3,6,9,12] 
    Expected Output: [0,-3,-6,-9,-12] 
+3

倍數N = [0,N ..] –

+0

非常感謝No_signal :)那甚至緊湊 – amanda

回答

3

如果只是將參數乘以連續的自然數,則可以避免分支:

multiples n = map (* n) [0..] 

這適用於所有n,正面或負面。 (和零,如果你不介意0的無限列表。)

+0

那是一個經典的剛一行代碼:)。非常感謝你 – amanda

+0

確保你看到了@ no_signal的評論;這是一個更短的方法。 – chepner

1

您需要在負版本來否定x

result1 = [-x | x <- [0..], x `mod`(- n) == 0] 

當然,這只是解決立即解決問題@ chepner的回答是更優雅

+0

非常感謝epsilonhalbe – amanda