なぜ私は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'
なぜ私は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'
Maybe
はタイプ名前です。そのタイプのコンストラクタはJust
とNothing
です。したがって、実際の値は、Just 5
(返す値がある場合)またはNothing
(空の場合)のいずれかの形式です。
@delnan:うん、すでにそれを修正しました。しかし、それをキャッチするためにありがとう。私はOCamlを考えていました。 – Chuck
Maybe
はtype constructorであり、その2つの可能なdata constructorsはNothing
とJust
あります。だからMaybe 5
の代わりにJust 5
と言う必要があります。このようなタイプはMaybe Int
(予告かもしれない新しいタイプを(結果の型はMaybe a
にa
の種類によって異なります)、構築するために使用されているので
> 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 Int
はMaybe Int
のインスタンスを作成します。
もう1つの主な違いは、パターンマッチングでのみデータコンストラクタを使用できることです。あなたが言うことができません。
case foo of
Maybe a -> ...
あなたが言っているでしょう:*
case foo of
Just a -> ...
Nothing -> ...
これまでのチュートリアルを読んでみると、型コンストラクタとデータコンストラクタの間にちょっと混乱しているようです。構文は同じで、チュートリアルの添付の段落に従っています。ちょうどaも型コンストラクタです(??)パラメータ化された型は、他の言語の "generic"型または "template"型に似ています。パラメータ化された型は、1つ以上の型パラメータをとります。たとえば、標準プレリュードのタイプMaybeは次のように定義されています。 dataおそらくa = Nothing |ちょうど –
@DavidKramfが私の答えを更新します。まだ不明なものが見つかった場合は、私に連絡してください。 –
@IonuţG. Stan: 'b :: Maybe a'の' a'は、あなたが定義した 'a'と同じではありません。おそらく、文字の衝突を避けるために、 'a'、' b'の代わりに 'x'、' y'を使うべきでしょうか? – Nefrubyr
どちらの答えは正確に正しいですが、私はまた、 '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