2015-02-17 17 views
5

Ben iki işlevi f ve g sahip varsayalım:andthen Scala iki bağımsız değişkenlerin fonksiyonu için

val f: (Int, Int) => Int = _ + _ 
val g: Int => String = _ + "" 

Şimdi bir fonksiyonu h

val h: (Int, Int) => String = f andThen g 

Maalesef bunu elde etmek için andThen onları oluşturmak istiyoruz derleme yapmıyor: (

scala> val h = (f andThen g) 
<console> error: value andThen is not a member of (Int, Int) => Int 
    val h = (f andThen g) 

Neden derleme yapmıyor ve (Int, Int) => String almak için f ve g'u nasıl oluşturabilirim?

+2

Muhtemel [Neden İşlev2'nin bir andThen yöntemine sahip değil?] Olası kopyası (https://stackoverflow.com/questions/21680117/why-doesnt-function2-have-an-andthen-method) – theon

cevap

9

andThenFunction1 yöntemidir çünkü derleme değil (bir parametrenin bir işlevi: scaladoc bakınız).

İşleviniz f'un iki parametresi vardır, bu nedenle Function2'un bir örneğidir (bkz. scaladoc).

scala> val h = f.tupled andThen g 
h: (Int, Int) => String = <function1> 

testi::

scala> val t = (1,1) 
scala> h(t) 
res1: String = 2 

Ayrıca h daha çağrısına yazabilir

o derlemek için almak için, tupling tarafından, bir parametrenin bir fonksiyonu haline f dönüştürmek gerekir auto-tupling, açıkça bir tuple oluşturmadan (her ne kadar oto-tupling karışıklık ve tür güvenliği kaybı nedeniyle biraz tartışmalı olsa da):

scala> h(1,1) 
res1: String = 2 
+0

Teşekkür ederiz! Muhtemelen tupled kullanacağım. – Michael

6

Function2, andThen yöntemine sahip değildir.

elle olsa, bunları oluşturabilirsiniz:

val h: (Int, Int) => String = { (x, y) => g(f(x,y)) } 
İlgili konular