リスト内の偶数だけを半分にする関数をHaskellで作成していますが、問題が発生しています。コンパイラを実行すると、intの除算を実行できないこと、およびint型の分数型宣言が必要であると不平を言います。型宣言をフロートに変更しようとしましたが、別のエラーが発生しました。以下に関数のコードを含めましたが、あらゆる形のヘルプを期待していました。
halfEvens :: [Int] -> [Int]
halfEvens [] = []
halfEvens (x:xs) | odd x = halfEvens xs
| otherwise = x/2:halfEvens xs
読んでくれてありがとう。
div
を使用して、整数除算を実行します。
halfEvens :: [Int] -> [Int]
halfEvens [] = []
halfEvens (x:xs) | odd x = halfEvens xs
| otherwise = x `div` 2 : halfEvens xs
(/)
関数は、型がFractionalクラスの引数を必要とし、標準の除算を実行します。 div
関数は、Integralクラスの型の引数を必要とし、整数除算を実行します。
より正確には、div
およびmod
は負の無限大に向かって丸められます。いとこquot
とrem
は、 Cの整数除算 のように動作し、ゼロに丸めます。 div
とmod
は、モジュラー算術を行う場合(たとえば、日付を指定して曜日を計算する場合)、通常は正しいですが、quot
とrem
はわずかに高速です)。
GHCiで少し遊んでみる:
> :t div
div :: Integral a => a -> a -> a
> :t (/)
(/) :: Fractional a => a -> a -> a
> 3 / 5
0.6
> 3 `div` 5
0
> (-3) `div` 5
-1
> (-3) `quot` 5
0
> [x `mod` 3 | x <- [-10..10]]
[2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1]
> [x `rem` 3 | x <- [-10..10]]
[-1,0,-2,-1,0,-2,-1,0,-2,-1,0,1,2,0,1,2,0,1,2,0,1]
map
を使用するとコードが単純になることを追加する必要があります。
HalfIfEven n
| even n = n `div` 2
| otherwise = n
halfEvens = map halfIfEven