次の Haskell 関数を検討してください。
sign a
| a < 0 = (-1)
| a > 0 = 1
| otherwise = 0
これをghciにロードすると、次のようになると予想され:t sign
ました。
sign :: (Num a, Ord a) => a -> Integer
代わりに、次のように推測しました。
*Main> :t sign
sign :: (Num a1, Num a, Ord a1) => a1 -> a
同様に、integer の型を尋ねると、5
期待Integer
したのですが、代わりに得られました。
*Main> :t 5
5 :: Num a => a
Haskell の型について、私が理解していないことがあります。問題は、戻り値の型について知っているのsign
は、それが型クラスのインスタンスであるということだけである場合、Num
その戻り値をこの関数に渡すことができないはずです。
double :: Integer -> Integer
double x = x * 2
つまり、私のdouble
関数には、 のInteger
インスタンスだけでなく、 が必要ですNum
。
それでも、以下は問題なく機能します。
*Main> double (sign 5.5)
2
Haskell の型システムについて誤解しているのは何ですか?