2010-08-11 36 views

Trả lời

21
scala> val f : Int => Int => Int = a => b => a + b 
f: (Int) => (Int) => Int = <function1> 

scala> Function.uncurried(f) 
res0: (Int, Int) => Int = <function2> 
+3

Ngẫu nhiên rằng không có phương pháp 'chưa được xử lý' trên' FunctionN'? –

+1

Để có một phương pháp chưa được kiểm tra trên Function1, bạn sẽ cần phải giới hạn các mục tiêu chấp nhận được của nó để thực hiện các hàm trả về. Đó là để nói chức năng với loại Function1 [A, Function1 [B, C]]. Điều đó có lẽ có thể được thực hiện với các ràng buộc kiểu tổng quát, nhưng chúng không có sẵn cho đến khi Scala 2.8. –

13

Mở rộng câu trả lời retonym của, cho đầy đủ

val f : Int => Int => Int = a => b => a + b 
val g: (Int, Int) => Int = Function.uncurried(f) 
val h: ((Int, Int)) => Int = Function.tupled(g) 

Các chức năng ngược lại cho cả hai hoạt động cũng được cung cấp trên đối tượng Chức năng, vì vậy bạn có thể viết ở trên về phía sau, nếu bạn muốn

val h: ((Int, Int)) => Int = x =>(x._1 + x._2) 
val g: (Int, Int) => Int = Function.untupled(h) 
val f : Int => Int => Int = g.curried //Function.curried(g) would also work, but is deprecated. Wierd 
9

Chỉ cần làm tròn câu trả lời, mặc dù có phương pháp thư viện để thực hiện việc này, cũng có thể có hướng dẫn để thực hiện điều đó bằng tay:

scala> val f = (i: Int) => ((s: String) => i*s.length) 
f: (Int) => (String) => Int = <function1> 

scala> val g = (i: Int, s: String) => f(i)(s) 
g: (Int, String) => Int = <function2> 

Hoặc nói chung,

def uncurry[A,B,C](f: A=>B=>C): (A,B)=>C = { 
    (a: A, b: B) => f(a)(b) 
} 
0

Tương tự như câu trả lời bởi Rex Kerr nhưng dễ đọc hơn.

type A = String 
type B = Int 
type C = Boolean 

val f: A => B => C = s => i => s.toInt+i > 10 

val f1: (A, B) => C = f(_)(_) 
Các vấn đề liên quan