2011-10-30 18 views
10

Nie rozumiem, dlaczego otrzymałem następującą odpowiedź od GHCi. Czy funkcja konstruktora nie jest Maybe?Początkujący Haskell

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

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

Odpowiedz

6

Maybe jest typ imię. Konstruktorzy tego typu to Just i Nothing, więc rzeczywista wartość typu Może jest w postaci Just 5 (dla przypadków, w których istnieje wartość, którą chcesz zwrócić) lub Nothing (dla pustego przypadku).

+0

@delnan: Tak, już to naprawiłem. Ale dzięki za to. Myślałem o OCaml. – Chuck

25

Maybe jest type constructor, a jego dwa możliwe data constructorsNothing 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 -> ... 
+1

Wygląda na to, że czytanie tutoriala do tej pory pozostawia mnie nieco pomieszanego między konstruktorem typów a konstruktorem danych. Składnia jest taka sama i zgodnie z załączonym akapitem z samouczka Just a jest także konstruktorem typu (??) Parametry sparametryzowane są podobne do typów "ogólnych" lub "szablonowych" w innych językach. Sparametryzowany typ przyjmuje jeden lub więcej parametrów typu. Na przykład typ Prelude standardowego jest zdefiniowany następująco: dane Może a = Nic | Tylko –

+0

@DavidKramf zaktualizować moją odpowiedź. Poinformuj mnie, jeśli wciąż coś nie jest jasne. –

+0

@ Ionuţ G. Stan: 'a' w' b :: Maybe a' nie jest tym samym 'a', które zdefiniowałeś. Być może powinieneś użyć zmiennych 'x',' y' zamiast 'a',' b', aby uniknąć konfliktów? – Nefrubyr

Powiązane problemy