Mới với Haskell, và tôi đang cố gắng tìm ra điều Monad này. Nhà điều hành bind monadic - >>=
- có một loại chữ ký rất đặc biệt:Tại sao lại sử dụng loại chức năng đặc biệt này trong monads?
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Để đơn giản hóa, chúng ta hãy thay Maybe
cho m
:
(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
Tuy nhiên, lưu ý rằng định nghĩa thể đã được viết bằng ba cách khác nhau:
(>>=) :: Maybe a -> (Maybe a -> Maybe b) -> Maybe b
(>>=) :: Maybe a -> ( a -> Maybe b) -> Maybe b
(>>=) :: Maybe a -> ( a -> b) -> Maybe b
Trong số ba thứ tôi n trung tâm là bất đối xứng nhất. Tuy nhiên, tôi hiểu rằng điều đầu tiên là vô nghĩa nếu chúng ta muốn tránh (những gì LYAH gọi mã soạn sẵn). Tuy nhiên, trong hai người tiếp theo, tôi thích cái cuối cùng. Đối với Maybe
, điều này sẽ trông giống như:
Khi điều này được định nghĩa là:
(>>=) :: Maybe a -> (a -> b) -> Maybe b
instance Monad Maybe where
Nothing >>= f = Nothing
(Just x) >>= f = return $ f x
Ở đây, a -> b
là một chức năng bình thường. Ngoài ra, tôi không thấy ngay bất kỳ điều gì không an toàn, bởi vì Nothing
bắt ngoại lệ trước ứng dụng chức năng, do đó, chức năng a -> b
sẽ không được gọi trừ khi thu được Just a
.
Vì vậy, có thể có điều gì đó không rõ ràng đối với tôi đã khiến định nghĩa (>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
được ưu tiên hơn định nghĩa đơn giản hơn nhiều (>>=) :: Maybe a -> (a -> b) -> Maybe b
? Có một số vấn đề vốn có liên quan đến định nghĩa đơn giản hơn (cái tôi nghĩ là a) không?
Có thể bạn không chính xác khi bạn nói rằng định nghĩa liên kết có thể đã được viết khác nhau; lưu ý rằng 'f :: Có thể a -> (Có thể a -> Có thể b) -> Có thể b == lật ($); và 'g :: Có thể a -> (a -> b) -> Có thể b == lật fmap'. Vì vậy, các chức năng khác mà bạn liệt kê đều hữu ích và cả hai đều tồn tại, chúng chỉ sống ở một nơi ngoài 'Monad'. – user2407038
'Có thể a -> (a -> b) -> Có thể b' sẽ không cho phép bạn liên kết một hàm trả về' Có thể b'. Bạn sẽ không thể có được một 'Nothing' nửa chừng thông qua một phép tính. – immibis
Một khả năng khác là 'Có thể -> Có thể (a -> b) -> Có thể b' - về cơ bản là' <*> 'từ' Áp dụng' (loại "ở giữa" Functor và Monad). –