2012-02-20 25 views

Trả lời

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

hoặc

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

hoặc thậm chí, cho currying thực tế,

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

Các chức năng này đều là ràng buộc để Int. Vâng, Scala không phải là một ngôn ngữ lập trình điểm, nó là một đối tượng được định hướng một, và một trong đó không có siêu lớp phổ biến cho tất cả các loại số. Dù sao, nếu bạn phản đối điều đó, thì bạn có một vấn đề hoàn toàn khác, được hỏi và trả lời nhiều lần ở đây trên Stack Overflow (trên thực tế, đó là câu hỏi Scala đầu tiên của tôi, iirc).

11

Nếu bạn muốn các chức năng được xử lý, sau đây có lẽ là cách ngắn gọn nhất để thực hiện.

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>) 

Bản đồ này tuy nhiên chỉ giới hạn ở Int s. Nếu bạn muốn các hoạt động chung, bạn sẽ phải sử dụng ngữ cảnh Numeric bị ràng buộc.

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] 

Báo cáo chính với phương pháp này là bản đồ được tạo mỗi khi bạn gọi ops.

Các vấn đề liên quan