SORU
31 Temmuz 2013, ÇARŞAMBA


Nedir &; kaldırma " " Scala?

Dönem okudum Scala ekosistem makaleleri okuduğumda bazen"""". kaldırdı / kaldırma Ne yazık ki, bu tam olarak ne anlama geldiğini açıkladı. Biraz araştırma yaptım ve görünen o ki kaldırma şey ile işlevsel değerleri falan gibi, ama mümkün değildi bulmak için bir metin olduğunu açıklıyor kaldırma aslında ne olduğu hakkında bir acemi dostu.

Adı germe olan, Lift çerçeve boyunca ilave bir karışıklık var, ama bu soruya cevap yardımcı olmuyor.

""Scala? kaldırma ne

CEVAP
31 Temmuz 2013, ÇARŞAMBA


Birkaç kullanımları vardır:

PartialFunction

PartialFunction[A, B] bir işlevi, etki alanı A isDefinedAt yöntem (belirtildiği gibi) bazı alt küme için tanımlanan bir hatırlayın. ""PartialFunction[A, B] Function[A, Option[B]] içine bir. bir asansör edebilirsiniz Yani, bir fonksiyon içinde tanımlanmıştüm13 ** tip Option[B] olan

Bu yöntem kesin çağırma tarafından yapılır PartialFunction lift.

scala> val pf: PartialFunction[Int, Boolean] = { case i if i > 0 => i % 2 == 0}
pf: PartialFunction[Int,Boolean] = <function1>

scala> pf.lift
res1: Int => Option[Boolean] = <function1>

scala> res1(-1)
res2: Option[Boolean] = None

scala> res1(1)
res3: Option[Boolean] = Some(false)

Yöntemleri

""Bir işlev çağırma. bir yöntem kaldırabilir Bu denireta-genişleme(bunun için Ben James için teşekkürler). Örneğin:

scala> def times2(i: Int) = i * 2
times2: (i: Int)Int

Uygulayarak bir işlev bir yöntem kaldırıyoruzalt çizgi

scala> val f = times2 _
f: Int => Int = <function1>

scala> f(4)
res0: Int = 8

Yöntem ve fonksiyonlar arasındaki temel fark unutmayın. res0örnekbir (örndeğer) (fonksiyon) türü (Int => Int)

Funktorlar

Birfunctor(olarak tanımlanmışscalazbazı "kap" (bu terimi kullanıyorumson derecegevşek), F öyle ki, eğer biz bir F[A] fonksiyon A => B, sonra da alabiliriz elimizde bir F[B] (düşünün, örneğin, F = List map yöntem)

Aşağıdaki gibi: bu özellik kodlama yapabiliriz

trait Functor[F[_]] { 
  def map[A, B](fa: F[A])(f: A => B): F[B]
}

Bu" işlevi A => B eşleme alanına. "kaldırmak için güçlü olmak için dönmesidir. Yani:

def lift[F[_]: Functor, A, B](f: A => B): F[A] => F[B]

F bir functor bir fonksiyonu varsa, A => B, 33* *bir işlevi var. Deneyin ve lift yöntemi uygulamak olabilir - çok basit kalıyor.

Transformers Monad

Gibihcoopzaşağıda (ve sadece bu kod gereksiz bir ton yazı beni kurtarabilecek fark ettim) diyor ki, "asansör" de bir anlamda . dönem ^strong>Transformers Monad. Monad bir transformatör bir şekilde "" birbiri (monadlar oluştur). monadlar istifleme olduğunu unutmayın

Yani, örneğin, IO[Stream[A]] döndüren bir fonksiyon olduğunu varsayalım. Bu StreamT[IO, A] trafo monad dönüştürülebilir. Şimdi "" başka bir değer de StreamT o IO[B] belki. bir asansör isteyebilirsiniz Bu yazabilirsiniz:

StreamT.fromStream(iob map (b => Stream(b)))

Ya da bu:

iob.liftM[StreamT]

bu bir soruyu akla getiriyor:neden StreamT[IO, B] içine IO[B] bir dönüştürmek istiyor muyum?. Cevabım şu olurdu "kompozisyon olanakları yararlanmak için". Hadi 43* *bir işlevi olduğunu varsayalım

lazy val f: (A, B) => C = ???
val cs = 
  for {
    a <- as                //as is a StreamT[IO, A]
    b <- bs.liftM[StreamT] //bs was just an IO[B]
  }
  yield f(a, b)

cs.toStream //is a Stream[IO[C]], cs was a StreamT[IO, C]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AyfionGaming

    AyfionGaming

    20 ŞUBAT 2013
  • jkimisyellow

    jkimisyellow

    6 Mayıs 2009
  • Tahir Jahi

    Tahir Jahi

    6 Mart 2006