"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
どうやらそういうことらしい。