私は最近 Haskell に飛び込み始めました。非常に興味深いが、その定義はNothing私を困惑させ、沈んでいない. GHCIについて
Prelude> :t Nothing
Nothing :: Maybe a
であってはならないNothing、Just NothingなぜMaybe aですか?
Maybeタイプの定義は次のとおりです。
data Maybe a = Nothing | Just a
これは、一部の typeaの場合、その型Maybe aには 2 つのコンストラクターがあることを示しています:NothingおよびJust a( LHS で適用されるa型変数と同じです)。Maybe
Just "foo"うまくいけば、 has typeMaybe StringとJust 'c'has typeの方法が明確になりますMaybe Char。しかし、タイプはNothing何ですか?Nothingには値が含まれていないため、そのコンストラクターは型変数を使用しないため、そのa型を特定の形式の に制約するものは何もありませんMaybe。
それは「多相定数」になります。すべてのタイプで同じように機能するため、Nothing任意のタイプが期待されるコンテキストで使用できます。Maybeそのため、GHCi はその型を単純に報告しMaybe aます。は任意の型を表すことができる変数であり、それが参照する型は、値が使用されるaコンテキストに基づく推論によって決定されます。Nothingしかし、Nothing単独で与えた場合、その特定の型に関する追加の手がかりがないため、変数だけが表示されます。
> :t Nothing
Nothing :: Maybe a
> :t (Nothing :: Maybe Int)
(Nothing :: Maybe Int) :: Maybe Int
> :t (Nothing :: Maybe Char)
(Nothing :: Maybe Char) :: Maybe Char
ところで、Just Nothing :: Maybe (Maybe a); それMaybeは別のものに包まれていMaybeます。
Maybe定義されています
data Maybe a = Nothing | Just a
typeのNothing(パラメータのない) 値コンストラクターもそうです。Maybe aaMaybe aMaybe BoolMaybe [IO (Int,Char)]a
Maybeと定義されている
data Maybe a = Nothing | Just a
したがって、 または のいずれかになりNothingますJust a。Mayba aは型で、NothingとJust aは値コンストラクタです。Just Nothingは、多分の中に包まれた多分になりMaybe (Maybe a)ます。
サブタイプを持つ Scala を考えてみましょう。と同等のものNothingは と呼ばれNoneます。は のサブタイプであるタイプ をNone持っています。Scala で is に相当するのは、 のサブタイプであるtype を持つisです。Haskell にはサブタイプがないため、両方を共通のスーパータイプとして型付けします。これが最も便利な型付けだからです。NoneOption[a]JustSome(foo)Some[Foo]Option[Foo]