2014-09-19 4 views
2

В Scala, как я могу добавить в Option[A] к Option[A]:Scala Applicatives?

Значения:

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

В Haskell я использовал бы аппликативный:

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

Существует ли Applicatives в в Scala стандартная библиотека Typafe?

+1

Обратите внимание, что в данном конкретном случае, если вы используете Scalaz экземпляр полугруппового для ' Опция [A: Полугруппа] 'немного понятнее - вы просто пишете' a | + | b'. –

ответ

3

С scalaz вы можете сделать это следующим образом:

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

аппликативных находятся не в стандартной библиотеке, но вы можете использовать для-постижений, как монады в Haskell:

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

(или перепишите его flatMap, конечно). В противном случае идите со сказазом, как в ответе Юджина.

0

Если вы просто хотите, чтобы достичь этого конкретного синтаксиса, вы можете объединить неявный класс с монадой для-пониманий:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^