Quelques définitions premier
import cats._, implicits._
val as = List(1, 2)
val bs = List("a", "b")
cari funciton
Si vous avez cari fonction, par exemple
val f = (i: Int) => (s: String) => Vector.fill(i)(s).mkString("")
Alors pure f <*> as <*> bs
expression est directement traduit aux chats comme
f.pure[List].ap(as).ap(bs)
Et f <$> as <*> bs
devient
as.map(f).ap(bs)
Oui, l'ordre est pas aussi naturel plus.
fonction Uncurried
Dans Scala très souvent, vous traiterez les fonctions prenant plusieurs paramètres:
val f2 = (i: Int, s: String) => Vector.fill(i)(s).mkString("")
// or val f2 = Function.uncurried(f)
Pour ces derniers, cats
fournit CartesianBuilder
syntaxe:
(as |@| bs).map(f2)
Ou , dans les versions les plus récentes, tuple h méthode map#
(qui est sujet à renommer, IIRC)
(as, bs).map2(f2)
Tous ces extraits est d'évaluer exactement la même chose à List("a", "b", "aa", "bb")
'pur f <*> x <*> y' comme' f <$> x <*> y', où '(<$>)' est un synonyme de 'fmap'. Je ne connais pas la syntaxe de Scala, ou quelque chose à propos de 'cats', mais à partir de votre question liée, vous semblez savoir où trouver' fmap' et '(<*>)' déjà, vous devriez donc pouvoir les utiliser. Si un synonyme infixe pour 'fmap' n'existe pas déjà, j'imagine que vous pouvez en définir un, si vous voulez que la syntaxe Scala ressemble plus à l'expression Haskell cible. – amalloy
Alternativement, 'f <$> x <*> y' est également le même que' liftA2 f x y'. De http://eed3si9n.com/herding-cats/Apply.html, il me semble que 'cats' définit cette fonction et l'appelle' map2'. – amalloy