2010-08-11 23 views
17

तो मेरे पास है:मैं स्केल में एक => बी => सी से (ए, बी) => सी कैसे प्राप्त करूं?

val f : Function1[A, Function1[B, C]] 

मैं कैसे हस्ताक्षर के साथ एक समारोह g मिलता है:

val g : (A, B) => C = error("todo") 

(यानी)

val g : Function2[A, B, C] //or possibly 
val g : Function1[(A, B), C] 

val f : A => B => C 

इस के लिए आशुलिपि है के संदर्भ में 0

?

उत्तर

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

कोई '' ही FunctionN' पर uncurried' विधि है अजीब है कि वहाँ? –

+1

फ़ंक्शन 1 पर एक अनिश्चित विधि रखने के लिए, आपको कार्यों को वापस करने वाले कार्यों के स्वीकार्य लक्ष्य को सीमित करना होगा। फ़ंक्शन 1 [ए, फ़ंक्शन 1 [बी, सी]] के साथ फ़ंक्शंस कहना है। यह संभवतः सामान्यीकृत प्रकार की बाधाओं के साथ किया जा सकता है, लेकिन वे स्कैला 2.8 तक उपलब्ध नहीं थे। –

13

,, पूर्णता

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) 

इन आपरेशनों दोनों के लिए बातचीत कार्य भी समारोह वस्तु पर प्रदान की जाती हैं के लिए retonym के जवाब का विस्तार है, तो आप पीछे की ओर से ऊपर लिख सकता है अगर आप

कामना
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

बस जवाब देने के लिए, हालांकि ऐसा करने के लिए एक लाइब्रेरी विधि है, यह हाथ से ऐसा करने के लिए भी निर्देशक हो सकता है:

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> 

या सामान्य रूप में,

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

रेक्स केर द्वारा जवाब देने के लिए इसी तरह की है, लेकिन पढ़ने में आसान।

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(_)(_) 
संबंधित मुद्दे