2016-08-01 67 views
4

数组没有函子实例它看起来像scalaz提供Functor实例ListArray(或Seq)不提供它。为什么会出现在Scalaz

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] = [email protected] 

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

这是为什么?他们不是functor吗?

+2

请参阅我的回答[这里](http://stackoverflow.com/a/24757668/334519)关于'Seq'情况的一些讨论。 –

回答

6

斯卡拉要求对象遵循Functor的法律。它还规定了代码构建的“一切不变的”理念。也就是说,Array是可变的,因此它们不会为它创建Functor实例。另一方面,Seq是一个抽象接口,它不知道“正确的”数据类型是什么。也就是说,对于Seq如何知道哪些底层对象返回,因此不违反任何法律?

+1

为什么'Functor'需要不可变?可变性破坏了哪些规则? – Michael

+0

@迈克尔没有法律要求不变性。正在努力实现的精神以及Scalaz背后的人们希望其他人走向的方向需要不变。 – wheaties

+0

明白了,谢谢。我应该使用'ImmutableArray'。 – Michael