2012-04-01 13 views
5

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.

+0

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'. –

+0

@Daniel: Rất tốt, cảm ơn thông tin! –

Trả lời

7

Không có lý do gì để không làm điều đó. Tuy nhiên, nó hiếm khi cần thiết. Ví dụ: trường hợp sử dụng của bạn có thể được viết lại là

composed = divideTenBy . (*10) <=< divideTenBy . (-)5 
+0

Tôi ngạc nhiên điều này đã không xảy ra với tôi, nó thực sự khá rõ ràng :) Tôi đoán điều này trả lời câu hỏi hoàn toàn tốt, cảm ơn bạn! –

Các vấn đề liên quan