Maybe
jest type constructor, a jego dwa możliwe data constructors są Nothing
i Just
. Więc musisz powiedzieć Just 5
zamiast 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
jest konstruktorem typu, ponieważ jest używany do konstruowania nowych typów (typ wynik zależy od rodzaju a
w Maybe a
), gdzie taki typ może być Maybe Int
(zawiadomienie, nie ma typu param a
więcej , tzn. wszystkie parametry typu są powiązane). Just a
i Nothing
są konstruktorami danych, ponieważ są używane do konstruowania wystąpień określonego typu Maybe
, na przykład Just Int
tworzy wystąpienia Maybe Int
.
Inną ważną różnicą jest to, że można używać tylko konstruktorów danych podczas dopasowywania wzorca. Nie można powiedzieć:
case foo of
Maybe a -> ...
Będziesz musiał powiedzieć:
case foo of
Just a -> ...
Nothing -> ...
Obie odpowiedzi są dokładnie rację, ale chcę też podkreślić, że 'maybe' (małe litery m) * to * funkcja, typu 'b -> (a -> b) -> Może a -> b':" Może funkcja przyjmuje wartość domyślną, funkcję i wartość Być może. Jeśli wartość Może to Nic, funkcja zwraca wartość domyślną, w przeciwnym razie stosuje funkcję do wartości wewnątrz wartości Just i zwraca wynik. " http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:maybe – MatrixFrog