私は最近ハスケル号へのダイビングを開始しました。 ITSは非常に興味深いが、Nothing
の定義が私をバッフルとGHCiのHaskell "Nothing"値の混乱
Prelude> :t Nothing
Nothing :: Maybe a
で。で沈没されていないNothing
はJust Nothing
、なぜMaybe a
ではないでしょうか?
私は最近ハスケル号へのダイビングを開始しました。 ITSは非常に興味深いが、Nothing
の定義が私をバッフルとGHCiのHaskell "Nothing"値の混乱
Prelude> :t Nothing
Nothing :: Maybe a
で。で沈没されていないNothing
はJust Nothing
、なぜMaybe a
ではないでしょうか?
はMaybe
タイプの定義である:
data Maybe a = Nothing | Just a
これは、いくつかのタイプa
ため、タイプMaybe a
は2つのコンストラクタを有すると述べている:Nothing
とJust a
(a
がMaybe
が適用されるのと同じ型の変数でありますLHS上で)。
Just "foo"
のタイプがMaybe String
で、Just 'c'
のタイプが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
定義されるようNothing
は全てa
の型Maybe a
の(パラメータなし)値コンストラクタであり、それが表す値は、それらがMaybe Bool
である、すべてのタイプMaybe a
に属することができ、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
はタイプNone
であり、サブタイプはOption[a]
です。Just
に相当するScalaは、タイプSome[Foo]
であり、サブタイプがOption[Foo]
であるSome(foo)
です。 Haskellはサブタイプを持たないため、共通のスーパータイプとして両方の型をタイプします。
ちょうど私が始めたばかりのとき、すぐに沈んでいないことを覚えているので、 '=' *の左にある大文字の名前( 'Maybe')は型シグネチャ*でしか見つからないのに対し、 '='の権利は*でしか見つかりません。慣例により、また意味があいまいではないため、単一コンストラクタ型の場合、型コンストラクタはその型と同じ名前を持つことがよくあります。私はこれが混乱していると思う。 – jberryman