问题描述
|
我编写了一个具有类似于Haskell类型类的Java接口的库,并实现了实现所有\“ derivable \”方法的抽象类(例如,可以使用
>>=
和return
编写Monad.join
)。这是我计划的结构([]表示该接口尚不存在):
Applicative <= Alternative <-,Functor <= Pointed <= Applicative <= Monad <= MondPlus
Functor <= Copointed <= Comonad Monad <= [MonadFix]
Category <= Arrow <= ArrowChoice
Arrow <= [ArrowApply]
Arrow <= [ArrowLoop]
Arrow <= [ArrowZero] <= [ArrowPlus]
Bifunctor
此层次结构是否“正确”?
特别是MonadPlus实施Alternative是否正确?
我应该从MonadPlus中拆分MonadZero吗? ArrowZero和ArrowPlus的相同问题
当一个类实现多个\“ endpoints \”(例如,也许是MonadPlus和MonadFix,Kleisli是ArrowEverything)时,如何减少代码重复
理论上,Arrow可以扩展Applicative。当前,我在Arrow上有一个返回该Applicative的方法,因为它看起来像类型继承使继承在这里不可能。
我是否还缺少其他非显而易见的\“ connections \”(例如Arrow-> Applicative)?
在此层次结构中缺少哪些“有用的”类型类?
解决方法
您应该确保查阅typeclassopedia。
爱德华·克梅特(Edward Kmett)一直在进行yeoman的工作,试图构造一个丰富,理智的核心类层次结构,从半群开始,然后向前发展。与他直接相对应的是值得的,但请看一下半群中标以及他为一些指针上载的许多相关软件包: