2017-08-01 6 views
0

Ceci est un suivi de mon précédent question:de style Applicative utilisant les chats bibliothèque

Supposons que je veux utiliser Applicative pour appliquer la fonction A => B => C à List[A] et List[B].
je crois qu'il ressemble à ça dans Haskell:

pure f <*> as <*> bs // apply f to List[A] and List[B] 

ou

f <$> as <*> bs 

-t-cats fournir une telle syntaxe? Comment l'écririez-vous avec cats?

+1

'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

+0

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

Répondre

1

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")

+0

Merci beaucoup. C'est ce que je cherchais. – Michael