私は次の値コンストラクタがあるとします。値コンストラクタで宣言された型がHaskell型でないのはなぜですか?
data Shape = Circle Float Float Float | Rectangle Float Float Float Float
今、私は実行することができます:
ghci> :t Circle
Circle :: Float -> Float -> Float -> Shape
今、私は型宣言
surface :: Shape -> Float
を書くことができます。しかし、私は入力できません型宣言
surface :: Circle -> Float
このis because「Circle
がタイプではない、Shape
がある」
私の質問は次のとおりです。型は値コンストラクタではないHaskellの中の型で宣言されているのはなぜ?
「値コンストラクタで宣言された型」である可能性があります。型ではないので、値のコンストラクタで宣言された型は間違いありません。彼らはデータコンストラクタです。また、 'surface :: 13 - > 1.2'という関数を書くこともできません。 – pdexter
'data'の構文は歴史的な事故です。より一貫した方法でコンストラクタに型を渡すには、GADT構文を使用します。 – augustss
@augustss ...実際には事故ではありません - 私はGADTsがまだ標準でさえない(それほど重要ではない) – Carsten