这是一个普遍性的问题,不涉及具体的代码。
假设你有一个类型为T a
的对象,可以为它提供一个Monad
实例。由于每个单子都是通过赋值pure = return
和(<*>) = ap
而成为了Applicative
,然后每个应用程序都是通过fmap f x = pure f <*> x
成为了Functor
,那么定义Monad
实例然后再给T
应用Applicative
和Functor
实例是否更好呢?
对我来说,这感觉有点反过来了。如果我在做数学而不是编程,我会认为我首先要证明我的对象是一个functor,然后继续添加限制,直到我也证明它是一个monad。我知道Haskell仅仅是受范畴论启发而已,显然,在构建证明时使用的技巧与编写有用程序时使用的技巧不同,但我想从Haskell社区得到一个意见。是从Monad
到Functor
更好呢?还是从Functor
到Monad
更好呢?
Monad
将成为Applicative
的子类,但我不确定这个变化确切发生的时间是什么时候。 - epsilonhalbeliftM
比没有重写规则的手写map
要低效。 - Gabriella Gonzalez