haskellで割り算するとき

haskellでコードを書いていて数値の計算を行うときにエラーが出て調べることが多いのでメモしとく

例えば、整数同士を割り算してから少数部分を切り上げたいとき以下の形だとエラーになる

myceiling :: Int -> Int -> Int
myceiling m n = ceiling $ m / n

これは/がIntに対しては適用できないため
ceilingと/の型は以下

*Main> :t (/)
(/) :: Fractional a => a -> a -> a
*Main> :t ceiling
ceiling :: (Integral b, RealFrac a) => a -> b

よって/によって割り算する場合は2引数ともFractionalのインスタンスの必要がある
そこで使うのがfromIntegral

*Main> :t fromIntegral 
fromIntegral :: (Integral a, Num b) => a -> b

これによってIntをNumとして扱うことができ、それに/を適用することでhaskell型推論によって
Fractionalとして扱ってくれる。つまりこのようにすればよい

myceiling :: Int -> Int -> Int
myceiling m n = ceiling $ (fromIntegral m) / (fromIntegral n)

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!