2016-08-01 2 views
4

Il ressemble à scalaz fournit une instance Functor pour List mais ne fournit pas pour Array (ou Seq).Pourquoi est-il pas par exemple Functor Array dans 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] 
        ^

Pourquoi est-ce? Ne sont-ils pas des foncteurs?

+2

Voir ma réponse [ici] (http://stackoverflow.com/a/24757668/334519) pour une discussion sur le cas 'Seq'. –

Répondre

6

Scalaz exige que les objets suivent les lois pour Functor s. Il prescrit également à la philosophie "tout immuable" de la construction de code. Cela dit, Array est mutable, donc ils ne créeraient pas une instance Functor pour cela. D'autre part, l'interface Seq est une interface abstraite et on ne sait pas quel sera le type de données "correct". C'est-à-dire, pour Seq comment savoir quel objet sous-jacent pour retourner et donc ne pas violer les lois?

+1

Pourquoi 'Functor' doit-il être immuable? Quelles lois la mutabilité brise-t-elle? – Michael

+0

@Michael aucune loi ne nécessite l'immuabilité. L'esprit de ce qui est en train d'être atteint et la direction que les gens derrière Scalaz aimeraient que les autres adoptent exigent l'immuabilité. – wheaties

+0

l'ai eu, merci. Je devrais probablement utiliser 'ImmutableArray'. – Michael