Vâng, chúng tương đương theo nghĩa là Option
loại cùng với Option.bind
và loại xây dựng Some
tạo thành một đơn nguyên.
Trong khi các đơn nguyên (như trong kiểu chữ Monad
) là một phần trung tâm của bản sắc Haskells, từ quan điểm khái niệm, chúng là một cấu trúc không thể biết ngôn ngữ. Một mẫu thiết kế nếu bạn thích. Nếu bạn có một loại, và bạn có một ràng buộc và hàm trả về với các chữ ký cụ thể tuân theo một bộ luật cụ thể - bạn có một đơn nguyên - bất kể ngôn ngữ bạn sử dụng.
Các biểu thức tính toán F # chỉ cung cấp một đường cú pháp có thể lập trình cho các đơn nguyên, tương tự như ký hiệu trong Haskell. Mặc dù không có trình Option
xây dựng biểu thức tính toán nào được cung cấp ngoài hộp, bạn có thể dễ dàng xác định một trình tạo xương trần như thế này:
type OptionBuilder () =
member this.Bind(m, f) = Option.bind f m
member this.Return(a) = Some a
let option = OptionBuilder ()
Và sử dụng nó như thế này:
let c =
option {
let! a = Some 4
let! b = None
return a + b
}
tương đương với đường như thế này:
let c =
(Some 4)
|> Option.bind (fun a ->
None
|> Option.bind (fun b ->
Some (a + b)))
Lưu ý cách các thành viên của trình xây dựng phản chiếu kiểu chữ Monad
và cách bạn có thể viết đơn âm - ngay cả khi bị sai - mã mà không có trình tạo.
that's not the case
? Họ trông rất giống tôi.