web-dev-qa-db-ja.com

Haskellの部門

リスト内の偶数だけを半分にする関数をHaskellで作成していますが、問題が発生しています。コンパイラを実行すると、intの除算を実行できないこと、およびint型の分数型宣言が必要であると不平を言います。型宣言をフロートに変更しようとしましたが、別のエラーが発生しました。以下に関数のコードを含めましたが、あらゆる形のヘルプを期待していました。

halfEvens :: [Int] -> [Int]
halfEvens [] = []
halfEvens (x:xs) | odd x = halfEvens xs
                 | otherwise = x/2:halfEvens xs

読んでくれてありがとう。

26
D347th

div を使用して、整数除算を実行します。

halfEvens :: [Int] -> [Int]
halfEvens [] = []
halfEvens (x:xs) | odd x = halfEvens xs
                 | otherwise = x `div` 2 : halfEvens xs

(/) 関数は、型がFractionalクラスの引数を必要とし、標準の除算を実行します。 div関数は、Integralクラスの型の引数を必要とし、整数除算を実行します。

より正確には、divおよびmodは負の無限大に向かって丸められます。いとこquotremは、 Cの整数除算 のように動作し、ゼロに丸めます。 divmodは、モジュラー算術を行う場合(たとえば、日付を指定して曜日を計算する場合)、通常は正しいですが、quotremはわずかに高速です)。

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]
39
Joey Adams

mapを使用するとコードが単純になることを追加する必要があります。

HalfIfEven n
  | even n = n `div` 2
  | otherwise = n

halfEvens = map halfIfEven
0
Caridorc