2016-08-01 61 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