2011-10-30 27 views
10

Neden GHCi'den aşağıdaki yanıtı aldığımı anlamıyorum. Maybe bir yapıcı işlevi değil mi?Haskell acemi

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

Hem cevaplar tam olarak doğru, ama ben de maybe' (küçük harf m) * olduğu 'işaret etmek istiyorum:

case foo of Maybe a -> ... 

Sen demek gerekecek: Söyleyemezsin b -> (a -> b) -> Belki a -> b' türünde bir işlev: "Belki işlev bir varsayılan değer, bir işlev ve bir Belki değeri alır. Belki değeri Hiçbir şey değilse, işlev varsayılan değeri döndürür.Aksi takdirde, işlevi Just içindeki değere uygular ve sonucu döndürür. " http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:maybe – MatrixFrog

cevap

6

Maybetip adıdır. Bu tür kurucular Just ve Nothing, bu nedenle Belki türünün bir değeri formu Just 5 (veya geri dönmek istediğiniz bir değer olduğunda) veya Nothing (boş durum için) şeklindedir.

+0

@delnan: Evet, bunu zaten çözdünüz. Gerçi yakaladığın için teşekkürler. OCaml'ı düşünüyordum. – Chuck

25

Maybe bir type constructor ve onun iki olası data constructorsNothing ve Just bulunmaktadır. Yani Maybe 5 yerine Just 5 demek zorundasınız.

> 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

yeni türleri oluşturmak için kullanılır, çünkü bir tür yapıcı olduğu böyle bir tip Maybe Int (haber olabilir, (sonuç türü Maybe a içinde a türüne bağlıdır), artık hiçbir tür param a var yani, tüm tip parametreleri bağlanır). Just a ve Nothing, veri kurucularıdır, çünkü belirli bir Maybe türünün örneklerini oluşturmak için kullanılırlar, örneğin Just Int, Maybe Int örneklerini oluşturur.

Diğer önemli bir fark, yalnızca veri eşleştiricilerinde şablon eşleştirmesi yapabilmenizdir. *

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

Şimdiye kadar öğreticinin okunması, yazımcı ile veri kurucusu arasında biraz kafa karıştırıcı gibi görünüyor. Sözdizimi aynıdır ve öğreticiden ekli paragrafa göre Sadece a da bir tür yapıcıdır (??) Parametreli türler diğer dillerdeki "genel" veya "şablon" türlerine benzer. Parametreli bir tür, bir veya daha fazla parametre alır. Örneğin, Standart Prelude tipi Belki aşağıdaki gibi tanımlanır: data Belki a = Nothing | Sadece bir –

+0

@DavidKramf cevabımı günceller. Hala belirsiz bir şey bulursan beni haberdar et. –

+0

@ Ionuț G. Stan: '' '' '' '' '' '' '' '' '' '' ile aynı değildir. Belki de harfleri çarpmamak için 'a',' b' yerine 'x',' y' değişkenlerini kullanmalısınız. – Nefrubyr