Maybe
là type constructor và hai số có thể data constructors là Nothing
và Just
. 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 a
và Nothing
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 -> ...
Nguồn
2011-10-30 20:11:29
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