Nói rằng tôi đã viết những mảnh Amazin mã sau đây:"<-" và giá trị đi kèm
func = do
a <- Just 5
return a
Nó khá vô nghĩa, tôi biết. Tại đây, a
là 5
và func
trả lại Just 5
.
Bây giờ tôi viết lại tuyệt vời chức năng (chưa vô nghĩa) của tôi:
func' = do
a <- Nothing
return a
Hàm này trả Nothing
, nhưng những gì heck là a
? Không có gì để trích xuất từ một giá trị Nothing
là, tuy nhiên chương trình không rên rỉ khi tôi làm điều gì đó như thế này:
func'' = do
a <- Nothing
b <- Just 5
return $ a+b
tôi chỉ có một thời gian khó khăn khi nhìn thấy những gì thực sự xảy ra. a
là gì? Nói cách khác: <-
thực sự làm gì? Nói nó "chiết xuất giá trị từ bên phải và liên kết nó với phía bên trái" rõ ràng là đơn giản hóa nó. Tôi không nhận được gì?
Cảm ơn :)
'<-' dịch thành' >> = '. Trong trường hợp 'Maybe' monad, nếu đối số đầu tiên (tức là phần bên phải' <-') là 'Nothing', không có gì khác được đánh giá và' >> = 'chỉ trả về' Nothing'. Vì vậy, để trả lời câu hỏi của bạn: việc thực hiện thậm chí không _reach_ 'a'. – Vitus
Suy nghĩ về monads là container, do-notation cho phép bạn gán nhãn cho các giá trị (nếu có) bên trong các monads, và sau đó xác định các hàm để áp dụng cho các giá trị đó. Nhưng việc khai thác là một ảo ảnh - các hàm được áp dụng _inside monad_ (sử dụng '>> =') bởi vì không có cách tổng quát nào để trích xuất một giá trị từ một đơn nguyên. Lưu ý cách bạn kết thúc mọi khối do bằng cách đặt kết quả _back vào monad_, thường sử dụng 'return'. Bạn không bao giờ thực sự có một biến 'a' bằng 5. – Nefrubyr