2011-10-30 39 views
10

Tôi không hiểu tại sao tôi nhận được phản hồi sau từ GHCi. Không phải là Maybe một hàm hàm tạo?Người mới bắt đầu của 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

Cả hai câu trả lời là hoàn toàn đúng, nhưng tôi cũng muốn chỉ ra rằng 'maybe' (chữ thường m) * là * một hàm, thuộc kiểu 'b -> (a -> b) -> Có thể a -> b':" Hàm có thể nhận giá trị mặc định, hàm và giá trị Có thể. Nếu giá trị Có thể là Không có gì, hàm trả về giá trị mặc định. Nếu không, nó sẽ áp dụng hàm cho giá trị bên trong chỉ và trả về kết quả. " http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:maybe – MatrixFrog

Trả lời

6

Maybeloại tên. Các hàm tạo của loại đó là JustNothing, do đó, giá trị thực tế của loại Có thể là một trong các dạng Just 5 (đối với trường hợp có giá trị bạn muốn trả lại) hoặc Nothing (đối với trường hợp trống).

+0

@delnan: Vâng, đã khắc phục điều đó. Cảm ơn bạn đã bắt nó. Tôi đã nghĩ đến OCaml. – Chuck

25

Maybetype constructor và hai số có thể data constructorsNothingJust. Vì vậy, bạn phải nói Just 5 thay vì 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 là một loại constructor vì nó được sử dụng để xây dựng các loại mới (loại kết quả phụ thuộc vào loại a trong Maybe a), nơi một kiểu như vậy có thể là Maybe Int (thông báo, không có loại param a nữa , tức là tất cả các tham số kiểu đều bị ràng buộc). Just aNothing là các trình tạo dữ liệu vì chúng được sử dụng để tạo các phiên bản của loại Maybe nhất định, ví dụ: Just Int tạo các phiên bản Maybe Int.

Một khác biệt lớn khác là bạn chỉ có thể sử dụng các nhà xây dựng dữ liệu khi đối sánh mẫu. Bạn không thể nói:

case foo of 
    Maybe a -> ... 

Bạn sẽ phải nói:

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

Có vẻ như đọc hướng dẫn cho đến nay lá tôi một chút nhầm lẫn giữa các nhà xây dựng loại và xây dựng dữ liệu. Cú pháp là giống nhau và theo đoạn được đính kèm từ hướng dẫn Chỉ cần một cũng là một hàm tạo kiểu (??) Các kiểu tham số tương tự như các kiểu "chung" hoặc "mẫu" trong các ngôn ngữ khác. Một kiểu tham số có một hoặc nhiều tham số kiểu. Ví dụ, loại Prelude chuẩn Có thể được định nghĩa như sau: dữ liệu Có thể a = Không có gì | Chỉ cần một –

+0

@DavidKramf cập nhật câu trả lời của tôi. Giữ cho tôi được đăng nếu bạn vẫn thấy bất cứ điều gì không rõ ràng. –

+0

@ Ionuț G. Stan: 'a' trong' b :: Có thể a' không giống 'a' bạn đã xác định. Có lẽ bạn nên sử dụng các biến 'x',' y' thay vì 'a',' b' để tránh các chữ cái xung đột? – Nefrubyr

Các vấn đề liên quan