Tôi muốn tạo ra một bản đồ đơn giản từ các nhà khai thác toán đến các chức năng có liên quan:currying Math Các nhà khai thác tại Scala
var ops = Map("+" -> +, "-" -> -)
Làm thế nào tôi có thể làm điều này trong Scala?
Tôi muốn tạo ra một bản đồ đơn giản từ các nhà khai thác toán đến các chức năng có liên quan:currying Math Các nhà khai thác tại Scala
var ops = Map("+" -> +, "-" -> -)
Làm thế nào tôi có thể làm điều này trong Scala?
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).
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
.