私は最近 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 a
a
Maybe a
Maybe Bool
Maybe [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 にはサブタイプがないため、両方を共通のスーパータイプとして型付けします。これが最も便利な型付けだからです。None
Option[a]
Just
Some(foo)
Some[Foo]
Option[Foo]