:: a
とは、「任意のタイプ」を意味しますが、サブタイプは意味しません。 a
はがInt
、Bool
、またはIO (Maybe Ordering)
となる可能性がありますが、特にそれはありません。 a
は正確にタイプではなく、タイプ変数です。
は、我々はこのような機能を持っているとしましょう:
id x = x
コンパイラは、私たちの引数x
のための特定のタイプが存在しないことを理解しています。私たちはのタイプをx
に使用することができます。それはidから出てくるものと同等である限りです。署名を以下のように書く:
-- /- Any type in...
-- | /- ...same type out.
-- V V
id :: a -> a
タイプはHaskellの大文字で始まることに注意してください。これは型ではありません:型変数です!
私たちは多型を使用する方が簡単だからです。
(>>>) :: (Bool -> Int) -> (Int -> String) -> (Bool -> String)
(>>>) f g a = g (f a)
(>>>') :: (Ordering -> Double) -> (Double -> IO()) -> (Ordering -> IO())
(>>>') f g a = g (f a)
(>>>'') :: (Int -> Int) -> (Int -> Bool) -> (Int -> Bool)
(>>>'') f g a = g (f a)
-- ...and so on.
:私たちは、このようにすべてのタイプを書かなければならなかった場合
plusOneTimesFive :: Int -> Int
plusOneTimesFive = (+1) >>> (* 5)
reverseHead :: [Bool] -> Bool
reverseHead = reverse >>> head
しかし、どのような:
(>>>) :: (a -> b) -> (b -> c) -> (a -> c)
(>>>) f g a = g (f a)
だから私たちはのようなものを書くことができます:例えば、組成物は、便利なアイデアですそれはただばかだ。
ので、コンパイラはそうのようなタイプの統一を使用してタイプを推測:
はのはGHCiのにI入力にこのことを言ってみましょう。ここでは簡略化のためをInt
としましょう。
id 6
コンパイラは考えて:id 6 :: Int
ので、id :: a -> a
」、そしてそれがInt
を渡されていますので、a = Int
これはないサブタイプであるサブタイピングは、型クラスを使用して取得することができますが、これは基本的な多型です。
'定義されていません 'は*サブタイプではありません。エラーです。なぜあなたはこれがサブタイピングだと思いますか? – AJFarmar
これは別の例です: 'mempty :: forall m。 Monoid m => m'、 'let x = mempty :: [Int]'とする。 – rampion
しかし、私は注意をそらしています。本当にここで起こっているのは、 'forall a。 aはbottomと同じです(https://wiki.haskell.org/Bottom)。 - bottomはすべての型の住人です(ただし、unboxed型の型に関するいくつかの注意点がありますが)。そのタイプはそうです。 – rampion