【发布时间】:2017-04-20 10:25:04
【问题描述】:
假设我有一个 Monoid 特征,如下所示:
trait Monoid[A] {
def combine(a1: A, a2: A): A
def identity: A
}
现在如果我想为此写一个 optionMonoid,我可以这样写:
val optionMonoid1 = new Monoid[Option[A]] {
def combine(a1: Option[A], a2: Option[A2]) a1 orElse a2
def identity = None
}
这是因为我对 Option 中的内部类型一无所知。但是,如果我想以一种我想真正组合 Option 中的内部类型的方式使用 combine 运算符呢?
【问题讨论】:
-
如果你想
map覆盖Option中的值,你需要一个 Functor 实例。 -
但是等等,Functor 实例不会改变我包含在 Option 中的类型吗?
-
即使我有一个 Functor 实例,我仍然不知道我的 A 是什么类型,因此我可以在我的类型 A 上应用组合运算符!
-
您已经可以利用
Option是一个 Functor 并且具有map函数这一事实。但是结合两个选项的真正含义是什么?您正在组合两个容器,它们可能包含也可能不包含值。你需要的是类型A有一个 Monoid 实例,这样你就可以在内部组合这些As。