Haskell Maybe/Either Functor, Monad和Applicative用法的一些总结

注意这篇文章只针对Maybe/Either!

Functor: 需要操作的数据可能已经失败, 但是操作一定成功

假设我们是某运维, 我们接到了一份错误日志说某个地方有问题, 我们被指派去用某种方式(例如单元测试)检查那个据说会出问题的地方, 如果真的有问题就要写一份报告(如果没问题就不用写了), 我们的测试方法绝对可靠.

type TestMethod = Error -> Report
check :: TestMethod -> Maybe Bug -> Maybe Report
check method bug = fmap method bug
-- Alternative:
check method bug = method <$> bug

值得注意后一种写法, 虽然是Applicative模块用来把函数装入Applicative的, 但是在Functor上也相当好用(本身fmap和<$>就是别名而已嘛).

Monad: 需要操作的数据可能已经失败, 而且操作可能失败

在前一个场景的基础上, 如果我们的测试方法可能出现玄学… 测不出来当然不需要写报告咯

type TestMethod = Error -> Maybe Report
check :: TestMethod -> Maybe Bug -> Maybe Report
check method bug = bug >>= method

Applicative: 需要操作的数据可能已经失败, 而且操作可能不存在(什么鬼), 但是操作一定成功

如果上面的大人物的方法是不会出错的, 但是我们可能根本就不会被指示用哪种测试方法, 而且作为好吃懒做的员工我们没有指示决不会轻举妄动, 在这种情况下, 当然也不可能有报告啦

type TestMethod = Error -> Report
check :: Maybe TestMethod -> Maybe Error -> Maybe Report
check method bug = method <*> bug

Either其实类似, 返回的错误信息更丰富

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s