2016-11-04 13 views
0

入力番号の倍数を求める次の関数を書いています。 負の数値を与えると、出力は肯定的なリストになります。負の数値を出力にリストするようにコードを変更するにはどうすればよいですか?Haskellを使用した倍数

マイ試してください:あなたは、負のバージョンでxを否定する必要が

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

がちょうど古典的な厥1行のコード:)。ありがとうございます – amanda

+0

@ no_signalのコメントを見たことを確認してください。それはさらに短いアプローチです。 – chepner

1

:もちろん

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

だけで、あなたの当面の問題の@のchepnerの答えを解決し、これははるかにエレガントである

+0

おかげでたくさんのepsilonhalbe – amanda

関連する問題