data Result t
= Ok t
fmap _ (Err msg
) = Err msg
instance Applicative Result where
pure = Ok
Ok f <*> Ok x = Ok (f x)
Ok f <*> Err msg = Err msg
Err msg <*> _ = Err msg
instance Monad Result
where (Ok v) >>= k = k v
(Err msg) >>= k = Err msg
data Item = Item {
getId Nothing = Err "No ID provided"
getItem
:: Int -> Result Item
| id `
rem`
2 == 0 = Ok
( Item
id Nothing
)
getName
:: Item
-> Result
StringgetName
(Item
id Nothing
) = Err
("Item has no name, ID = " ++ show id)getName (Item _ (Just name)) = Ok name
doSomethingClever
id name
= show id ++ " => " ++ name
tryToDoSomethingClever idParam = do
name <- getName item
demoInputs = [Nothing, Just 1, Just 2, Just 3]
main
= mapM_ (print . tryToDoSomethingClever
) demoInputs
ZGF0YSBSZXN1bHQgdAoJPSBPayB0Cgl8IEVyciBTdHJpbmcKCWRlcml2aW5nIChTaG93LCBFcSkKCmluc3RhbmNlIEZ1bmN0b3IgUmVzdWx0IHdoZXJlCglmbWFwIGYgKE9rICB4KSAgID0gT2sgKGYgeCkKCWZtYXAgXyAoRXJyIG1zZykgPSBFcnIgbXNnCgppbnN0YW5jZSBBcHBsaWNhdGl2ZSBSZXN1bHQgd2hlcmUKCXB1cmUgPSBPawoJT2sgIGYgICA8Kj4gT2sgIHggICA9IE9rIChmIHgpCglPayAgZiAgIDwqPiBFcnIgbXNnID0gRXJyIG1zZwoJRXJyIG1zZyA8Kj4gXyAgICAgICA9IEVyciBtc2cKCmluc3RhbmNlIE1vbmFkIFJlc3VsdCB3aGVyZQogICAgKE9rIHYpICAgID4+PSBrID0gayB2CiAgICAoRXJyIG1zZykgPj49IGsgPSBFcnIgbXNnCiAgICByZXR1cm4gdiA9IE9rIHYKICAgIGZhaWwgbXNnID0gRXJyIG1zZwoKCmRhdGEgSXRlbSA9IEl0ZW0gewoJaWQgICAgOjogSW50LAoJbmFtZSAgOjogTWF5YmUgU3RyaW5nCgl9IGRlcml2aW5nIChTaG93LCBFcSkKCmdldElkIDo6IE1heWJlIEludCAtPiBSZXN1bHQgSW50CmdldElkICBOb3RoaW5nICA9IEVyciAiTm8gSUQgcHJvdmlkZWQiCmdldElkIChKdXN0IGlkKSA9IE9rIGlkCgpnZXRJdGVtIDo6IEludCAtPiBSZXN1bHQgSXRlbQpnZXRJdGVtIGlkCgl8IGlkIGByZW1gIDIgPT0gMCAgPSAgT2sgICggSXRlbSBpZCAgTm90aGluZykKCXwgaWQgYHJlbWAgMyA9PSAwICA9ICBPayAgKCBJdGVtIGlkIChKdXN0ICgiaXRlbS0iICsrIHNob3cgaWQpKSkKCXwgb3RoZXJ3aXNlICAgICAgICA9ICBFcnIgKCJJdGVtIG5vdCBmb3VuZCwgSUQgPSAiICsrIHNob3cgaWQpCgpnZXROYW1lIDo6IEl0ZW0gLT4gUmVzdWx0IFN0cmluZwpnZXROYW1lIChJdGVtIGlkIE5vdGhpbmcgICApID0gRXJyICgiSXRlbSBoYXMgbm8gbmFtZSwgSUQgPSAiICsrIHNob3cgaWQpCmdldE5hbWUgKEl0ZW0gXyAoSnVzdCBuYW1lKSkgPSBPayBuYW1lCgpkb1NvbWV0aGluZ0NsZXZlciA6OiBJbnQgLT4gU3RyaW5nIC0+IFN0cmluZwpkb1NvbWV0aGluZ0NsZXZlciBpZCBuYW1lID0gc2hvdyBpZCArKyAiID0+ICIgKysgbmFtZQoKdHJ5VG9Eb1NvbWV0aGluZ0NsZXZlciA6OiBNYXliZSBJbnQgLT4gUmVzdWx0IFN0cmluZwp0cnlUb0RvU29tZXRoaW5nQ2xldmVyIGlkUGFyYW0gPSBkbwoJaWQgICA8LSBnZXRJZCBpZFBhcmFtCglpdGVtIDwtIGdldEl0ZW0gaWQKCW5hbWUgPC0gZ2V0TmFtZSBpdGVtCglyZXR1cm4gKGRvU29tZXRoaW5nQ2xldmVyIGlkIG5hbWUpCgpkZW1vSW5wdXRzID0gW05vdGhpbmcsIEp1c3QgMSwgSnVzdCAyLCBKdXN0IDNdCgptYWluID0gbWFwTV8gKHByaW50IC4gdHJ5VG9Eb1NvbWV0aGluZ0NsZXZlcikgZGVtb0lucHV0cwo=