12

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'
4

2 に答える 2

26

Maybe型コンストラクタであり、その 2 つの可能なデータ コンストラクタNothingJustです。だからあなたはJust 5代わりに言う必要がありMaybe 5ます .

> 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は、新しい型を構築するために使用されるため (結果の型はainの型に依存しますMaybe a) 、型Maybe Intコンストラクターaです。Just aおよびは、特定の型Nothingのインスタンスを構築するために使用されるため、データ コンストラクターです。たとえば、 のインスタンスを作成します。MaybeJust IntMaybe Int

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

case foo of
     Maybe a -> ...

あなたは言う必要があります:

case foo of
     Just a  -> ...
     Nothing -> ...
于 2011-10-30T20:11:29.607 に答える
6

Maybe型名です。その型のコンストラクターはJustandであるため、 Maybe 型のNothing実際のJust 5は(戻りたい値がある場合) またはNothing(空の場合) のいずれかの形式になります。

于 2011-10-30T20:10:25.800 に答える