2012-03-27 20 views
3

私は最近ハスケル号へのダイビングを開始しました。 ITSは非常に興味深いが、Nothingの定義が私をバッフルとGHCiのHaskell "Nothing"値の混乱

Prelude> :t Nothing 
Nothing :: Maybe a 

で。で沈没されていないNothingJust Nothing、なぜMaybe aではないでしょうか?

答えて

19

Maybeタイプの定義である:

data Maybe a = Nothing | Just a 

これは、いくつかのタイプaため、タイプMaybe aは2つのコンストラクタを有すると述べている:NothingJust aaMaybeが適用されるのと同じ型の変数であります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にラップされています。

+1

ちょうど私が始めたばかりのとき、すぐに沈んでいないことを覚えているので、 '=' *の左にある大文字の名前( 'Maybe')は型シグネチャ*でしか見つからないのに対し、 '='の権利は*でしか見つかりません。慣例により、また意味があいまいではないため、単一コンストラクタ型の場合、型コンストラクタはその型と同じ名前を持つことがよくあります。私はこれが混乱していると思う。 – jberryman

6

Maybe

data Maybe a = Nothing | Just a 

定義されるようNothingは全てaの型Maybe aの(パラメータなし)値コンストラクタであり、それが表す値は、それらがMaybe Boolである、すべてのタイプMaybe aに属することができ、Maybe [IO (Int,Char)]又はaがインスタンス化されます。

4

Maybe

data Maybe a = Nothing | Just a 

として定義されているので、それはNothingまたはJust aのいずれかとすることができます。 Mayba aがタイプであり、NothingJust aは値コンストラクタです。 Just Nothingはおそらく、おそらくMaybe (Maybe a)の中にラップされています。ここ

1

サブタイプがあるScalaを検討してください。 Nothingに相当するものはNoneと呼ばれます。 NoneはタイプNoneであり、サブタイプOption[a]です。Justに相当するScalaは、タイプSome[Foo]であり、サブタイプOption[Foo]であるSome(foo)です。 Haskellはサブタイプを持たないため、共通のスーパータイプとして両方の型をタイプします。