2011-10-30 28 views
10

なぜ私はGHCiから次の応答を得るのか分かりません。 Maybeはコンストラクタ関数ではありませんか?ハスケル初心者

Prelude> :t Maybe 

<interactive>:1:1: Not in scope: data constructor `Maybe' 
Prelude> let e = Maybe 5 

<interactive>:1:9: Not in scope: data constructor `Maybe' 
+0

どちらの答えは正確に正しいですが、私はまた、 'maybe'(小文字メートル)*があることを指摘したいですMaybe値がNothingであれば、関数はデフォルト値、関数、およびMaybe値をとります。関数は、b - >(a - > b) - >おそらくa - > b':デフォルト値を返します。それ以外の場合は、Just関数内の値に関数を適用し、結果を返します。 http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:maybe – MatrixFrog

答えて

6

Maybeタイプ名前です。そのタイプのコンストラクタはJustNothingです。したがって、実際のは、Just 5(返す値がある場合)またはNothing(空の場合)のいずれかの形式です。

+0

@delnan:うん、すでにそれを修正しました。しかし、それをキャッチするためにありがとう。私はOCamlを考えていました。 – Chuck

25

Maybetype constructorであり、その2つの可能なdata constructorsNothingJustあります。だからMaybe 5の代わりにJust 5と言う必要があります。このようなタイプはMaybe Int(予告かもしれない新しいタイプを(結果の型はMaybe aaの種類によって異なります)、構築するために使用されているので

> let x = Just 5 
> x 
Just 5 
> let y = Nothing 
> y 
Nothing 
> :type x 
x :: Maybe Integer 
> :type y 
y :: Maybe a 
> :info Maybe 
data Maybe a = Nothing | Just a  -- Defined in Data.Maybe 
instance Eq a => Eq (Maybe a) -- Defined in Data.Maybe 
instance Monad Maybe -- Defined in Data.Maybe 
instance Functor Maybe -- Defined in Data.Maybe 
instance Ord a => Ord (Maybe a) -- Defined in Data.Maybe 
instance Read a => Read (Maybe a) -- Defined in GHC.Read 
instance Show a => Show (Maybe a) -- Defined in GHC.Show 

Maybeは型コンストラクタで、何のタイプのparam aはもうありませんつまり、すべての型パラメーターがバインドされています)。 Just aおよびNothingは、特定のMaybeタイプのインスタンスを作成するために使用されるため、データコンストラクタです。たとえば、Just IntMaybe Intのインスタンスを作成します。

もう1つの主な違いは、パターンマッチングでのみデータコンストラクタを使用できることです。あなたが言うことができません。

case foo of 
    Maybe a -> ... 

あなたが言っているでしょう:*

case foo of 
    Just a -> ... 
    Nothing -> ... 
+1

これまでのチュートリアルを読んでみると、型コンストラクタとデータコンストラクタの間にちょっと混乱しているようです。構文は同じで、チュートリアルの添付の段落に従っています。ちょうどaも型コンストラクタです(??)パラメータ化された型は、他の言語の "generic"型または "template"型に似ています。パラメータ化された型は、1つ以上の型パラメータをとります。たとえば、標準プレリュードのタイプMaybeは次のように定義されています。 dataおそらくa = Nothing |ちょうど –

+0

@DavidKramfが私の答えを更新します。まだ不明なものが見つかった場合は、私に連絡してください。 –

+0

@IonuţG. Stan: 'b :: Maybe a'の' a'は、あなたが定義した 'a'と同じではありません。おそらく、文字の衝突を避けるために、 'a'、' b'の代わりに 'x'、' y'を使うべきでしょうか? – Nefrubyr