2014-09-19 2 views
2

En Scala, comment puis-je ajouter un Option[A]-Option[A]:Scala Applicatives?

Signification:

Some("foo") ??? Some("bar") == Some("foobar")

Dans Haskell j'utiliser un applicatif:

ghci>import Control.Applicative 
ghci> (++) <$> (Just "foo") <*> (Just "bar") 
Just "foobar" 

Y at-il Applicatives dans Scala bibliothèque standard Typesafe?

+1

Notez que dans ce cas précis si vous utilisez Scalaz l'instance de semigroupe pour ' L'option [A: Semigroup] 'est un peu plus claire - vous venez d'écrire' a | + | b'. –

Répondre

3

Avec scalaz vous pouvez le faire de cette façon:

import scalaz.syntax.applicative._ 
    import scalaz.std.option._ 

    val l: Option[String] = Some("foo") 
    val r: Option[String] = Some("bar") 
    val result = ^(l, r)(_ + _) 
    println(result) // Some("foobar") 
2

ne sont pas dans des applicatifs de la bibliothèque standard, mais vous pouvez utiliser pour-compréhensions comme monades à Haskell:

for { 
    l <- Some("foo") 
    r <- Some("bar") 
} yield (l + r) 

(ou réécrivez-le avec flatMap, bien sûr). Sinon, allez avec scalaz, comme dans la réponse d'Eugene.

0

Si vous voulez juste pour obtenir cette syntaxe particulière, vous pouvez combiner une classe implicite avec une monade pour-compréhension:

implicit class RichOption(a: Option[String]) { 
    def ???(b: Option[String]) = for (sa <- a; sb <- b) yield sa+sb 
} 

scala> Some("foo") ??? Some("bar") == Some("foobar") 
res4: Boolean = true