2015-02-17 13 views
5

Giả sử tôi có hai chức năng fg:andThen cho chức năng của hai đối số trong Scala

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

Bây giờ tôi muốn soạn chúng với andThen để có được một hàm h

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

Đáng tiếc là nó không biên dịch :(

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

Tại sao nó không biên dịch và làm thế nào tôi có thể soạn fg để nhận (Int, Int) => String?

+2

Bản sao có thể có của [Tại sao không có Function2 có phương thức andThen?] (Https://stackoverflow.com/questions/21680117/why-doesnt-function2-have-an-andthen-method) – theon

Trả lời

9

Nó không biên dịch vì andThen là một phương pháp Function1 (một chức năng của một tham số: xem scaladoc).

Chức năng của bạn f có hai tham số, vì vậy sẽ là một phiên bản của Function2 (xem scaladoc).

Để có được nó để biên dịch, bạn cần phải chuyển đổi f vào một chức năng của một tham số, bởi tupling:

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

kiểm tra:

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

Bạn cũng có thể viết lời kêu gọi h hơn đơn giản chỉ vì auto-tupling, mà không tạo ra một cách rõ ràng một tuple (mặc dù tính năng tự động tupling là một chút tranh cãi do tiềm năng của nó đối với sự nhầm lẫn và mất type-an toàn):

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

Cảm ơn bạn! Tôi có thể sẽ sử dụng 'tupled'. – Michael

6

Function2 không có phương thức andThen.

Bạn có thể tự soạn cho họ, mặc dù:

val h: (Int, Int) => String = { (x, y) => g(f(x,y)) } 
Các vấn đề liên quan