3

私は最近 Haskell に飛び込み始めました。非常に興味深いが、その定義はNothing私を困惑させ、沈んでいない. GHCIについて

Prelude> :t Nothing
Nothing :: Maybe a

であってはならないNothingJust NothingなぜMaybe aですか?

4

4 に答える 4

19

Maybeタイプの定義は次のとおりです。

data Maybe a = Nothing | Just a

これは、一部の typeaの場合、その型Maybe aには 2 つのコンストラクターがあることを示しています:NothingおよびJust a( LHS で適用されるa型変数と同じです)。Maybe

Just "foo"うまくいけば、 has typeMaybe StringJust '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ます。

于 2012-03-27T11:39:27.430 に答える
6

Maybe定義されています

data Maybe a = Nothing | Just a

typeのNothing(パラメータのない) 値コンストラクターもそうです。Maybe aaMaybe aMaybe BoolMaybe [IO (Int,Char)]a

于 2012-03-27T11:38:56.277 に答える
4

Maybeと定義されている

data Maybe a = Nothing | Just a

したがって、 または のいずれかになりNothingますJust aMayba aは型で、NothingJust aは値コンストラクタです。Just Nothingは、多分の中に包まれた多分になりMaybe (Maybe a)ます。

于 2012-03-27T11:39:17.977 に答える
1

サブタイプを持つ Scala を考えてみましょう。と同等のものNothingは と呼ばれNoneます。は のサブタイプであるタイプ をNone持っています。Scala で is に相当するのは、 のサブタイプであるtype を持つisです。Haskell にはサブタイプがないため、両方を共通のスーパータイプとして型付けします。これが最も便利な型付けだからです。NoneOption[a]JustSome(foo)Some[Foo]Option[Foo]

于 2012-03-27T17:18:54.030 に答える