为什么Scalaz中没有Array的Functor实例?

5

看起来 scalazList 提供了一个 Functor 实例,但是没有为 Array(或 Seq)提供。

scala> val fa = Functor[Array]
<console>:17: error: could not find implicit value for parameter F: scalaz.Functor[Array]
       val fa = Functor[Array]
                       ^
scala> val fl = Functor[List]
fl: scalaz.Functor[List] = scalaz.std.ListInstances$$anon$1@20c4b59

scala> val fl = Functor[Seq]
<console>:17: error: could not find implicit value for parameter F: scalaz.Functor[Seq]
       val fl = Functor[Seq]
                       ^

为什么呢?它们不是函数对象吗?

2
请查看我的回答这里,其中讨论了Seq情况。 - Travis Brown
1个回答

7

Scalaz要求对象遵循Functor的法则。它还支持“一切皆不可变”的代码构建哲学。也就是说,Array是可变的,因此他们不会为其创建Functor实例。另一方面,Seq是一个抽象接口,不知道“正确”的数据类型将是什么。也就是说,对于Seq,如何确定返回哪个底层对象,从而不违反任何规定?


1
为什么要求 Functor 是不可变的?哪些法则会被可变性打破? - Michael
@Michael,没有法律要求不可变性。Scalaz背后的人想要达到的目标和方向需要不可变性。 - wheaties
明白了,谢谢。我应该使用 ImmutableArray - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接