"ghci> (length [1..10]) / 2"がerrorを吐く理由

"/"(in haskell) ≒ "/." (in OCaml)ということみたい。

以下の式を実行するとエラーになる。

ghci> (length [1..10]) / 2

<interactive>:1:0:
    No instance for (Fractional Int)
      arising from a use of `/' at <interactive>:1:0-19
    Possible fix: add an instance declaration for (Fractional Int)
    In the expression: (length ([1 .. 10])) / 2
    In the definition of `it': it = (length ([1 .. 10])) / 2

型式を見てみる。

:type (/) -- => (/) :: (Fractional a) => a -> a -> a
:type div -- => div :: (Integral a) => a -> a -> a

あー、型が違ったのか。

詳しく

:info Fractional -- => class (Num a) => Fractional a where
--   (/) :: a -> a -> a
--   recip :: a -> a
--   fromRational :: Rational -> a
--   	-- Defined in GHC.Real
-- instance Fractional Double -- Defined in GHC.Float
-- instance Fractional Float -- Defined in GHC.Float
:type 0.1 -- => 0.1 :: (Fractional t) => t
:type 0.1 ::Double -- => 0.1 ::Double :: Double
:type 0.1 ::Float -- => 0.1 ::Float :: Float

:info Integral -- => class (Real a, Enum a) => Integral a where
--   quot :: a -> a -> a
--   rem :: a -> a -> a
--   div :: a -> a -> a
--   mod :: a -> a -> a
--   quotRem :: a -> a -> (a, a)
--   divMod :: a -> a -> (a, a)
--   toInteger :: a -> Integer
--   	-- Defined in GHC.Real
-- instance Integral Integer -- Defined in GHC.Real
-- instance Integral Int -- Defined in GHC.Real
:type 10 ::Int  -- => 10 ::Int :: Int
:type 10 ::Integer -- => 10 ::Integer :: Integer
(10 ^ 10) ::Int -- => 10000000000
(10 ^ 50) ::Int -- => -5376172055173529600
(10 ^ 50) ::Integer -- => 100000000000000000000000000000000000000000000000000

どうやらそういうことらしい。