Tôi hiện đang chơi xung quanh với cơ bản Haskell và stumbled khi các "trường hợp sử dụng" sau đây:Sử dụng một hàm một → b là "monadic" chức năng một → mb
ghci> let divideTenBy x | x == 0 = Nothing | otherwise = Just (10/x)
ghci> let composed = divideTenBy <=< return . (*10) <=< divideTenBy <=< return . (-)5
ghci> Just 5 >>= composed
Nothing
ghci> Just 10 >>= composed
Just (-0.5)
Vì vậy, tôi về cơ bản trộn monadic và các hàm thuần túy ở đây và soạn chúng thành một hàm đơn điệu. Điều này làm việc, nhưng return . (*10)
dường như với tôi như một thứ thường cần thiết, vì vậy tôi bị cám dỗ để định nghĩa một cách viết tắt cho nó, giống như monadify = (return.)
.
Trước khi tôi làm điều đó, tuy nhiên, tôi muốn hỏi liệu đã có những người giúp đỡ để đối phó với loại tình huống đó chưa. Tất nhiên tôi cũng có thể bị nhầm lẫn về toàn bộ sự việc và có những lý do tại sao điều này không nên được thực hiện. Nếu vậy, xin vui lòng cho tôi biết.
Cũng lưu ý rằng 'mu >> = return. f === liftM f mu === fmap f mu' (sau này yêu cầu một cá thể 'Functor', nhưng tất cả' Monad 'có một). Như câu trả lời của Daniel Wagner minh họa, 'trở lại. f> => foo === foo. f'. Ở vị trí đối số khác của '(> =>)', nó không hoàn toàn đẹp, 'foo> => return. f === fmap f. foo'. –
@Daniel: Rất tốt, cảm ơn thông tin! –