2012-02-20 43 views

cevap

6
val ops = Map("+" -> ((_: Int) + (_: Int)), "-" -> ((_: Int) - (_:Int))) 

veya

val ops = Map[String, (Int, Int) => Int]("+" -> (_+_), "-" -> (_-_)) 

hatta gerçek-işlemden için

,

val ops = Map("+" -> ((_: Int) + (_: Int)).curried, "-" -> ((_: Int) - (_:Int)).curried) 

Bu fonksiyonlar Int tüm bağlamak vardır. Scala, nokta-içermeyen bir programlama dili değil, nesneye yönelik bir nesne ve tüm sayısal türlerde ortak bir sınıf bulunmayan bir programdır. Her neyse, eğer buna itiraz ederseniz, o zaman tamamen farklı bir soruna sahip olursunuz, ki burada bir çok kez Stack Overflow üzerinde sorulmuştur ve yanıtlanmıştır (aslında, ilk Scala sorusu, iirc).

11

İşlevlerin küflenmesini istiyorsanız, muhtemelen bunu yapmanın en kısa yolu.

scala> val ops: Map[String, Int => Int => Int] = Map(
    | "+" -> (x => y => x + y), 
    | "-" -> (x => y => x - y) 
    |) 
ops: Map[String,Int => Int => Int] = Map(+ -> <function1>, - -> <function1>) 

Bu harita ancak sadece Int s ile sınırlıdır. Genel işlemler istiyorsanız, Numeric bağlamını kullanmanız gerekir.

scala> def ops[N : Numeric]: Map[String, N => N => N] = { 
    | import Numeric.Implicits._ 
    | Map(
    |  "+" -> (x => y => x + y), 
    |  "-" -> (x => y => x - y) 
    | ) 
    | } 
ops: [N](implicit evidence$1: Numeric[N])Map[String,N => N => N] 

bu yaklaşımın önemli bir uyarı, bir harita ops diyoruz her zaman oluşturulan alır olmasıdır.