Вот как я это сделал, чтобы выполнить аналогичное требование.

аюсь определить литерал Map с ключом:String, стоимость:(Any)=>String, Я пробовал следующее, но получаю синтаксическую ошибку:

def foo(x: Int): String = /...
def bar(x: Boolean): String = /...
val m = Map[String, (Any) => String]("hello" -> foo, "goodbye" -> bar)
 Ken Bloom06 янв. 2011 г., 19:05
Даже если синтаксис в вашем вопросе сработал, должно быть что-то смешное, что вы делаете с типами, чтобы отправлять правильный тип функции, которую вы получаете с карты. Здесь намного больше осложнений. Что тыдействительно пытаешься сделать? Может быть, есть лучшее решение, полностью не основанное на карте функций разных типов.

Ответы на вопрос(5)

чтобы выполнить аналогичное требование.

object MapToMethods {
private def increment(x: Int): Int = x+1
private def decrement(x: Int): Int = x-1

val m: Map[String, Int => Int] =Map("increment" -> increment, "decrement" ->decrement)

println(m("increment")(2)) //prints 3
println(m("decrement")(3)) //prints 2
}

Черта характераFunction1 является контрвариантным для параметра, поэтомуdef foo(x: Int): String это не(Any) => String, Таким образом, будет работать следующее:

 def baz(x: Any): String = "baz"                         
baz: (x: Any)String

; val m2 = Map[String, (String) => String]("hello" -> baz)
m2: scala.collection.immutable.Map[String,(String) => String] = Map((hello,<function1>))
Решение Вопроса

Забавно, что на самом деле никто не дал такой типбыло бы работай. Вот один из таких:

def foo(x: Int): String = x.toString
def bar(x: Boolean): String = x.toString
val m = Map[String, (Nothing) => String]("hello" -> foo, "goodbye" -> bar)

Причина, почему это работает так, потому чтоFunction1 на входе противопоказан, поэтому(Nothing) => String это суперкласс(Int) => String, Это также ко-вариант на выходе, так(Nothing) => Any будет суперклассом для любого другогоFunction1.

Конечно, вы не можете использовать это так. Без манифестов, вы даже не можете раскрыть, что оригинальный типFunction1 является. Вы можете попробовать что-то вроде этого, хотя:

def f[T : Manifest](v: T) = v -> manifest[T]
val m = Map[String, ((Nothing) => String, Manifest[_])]("hello" -> f(foo), "goodbye" -> f(bar))

val IntManifest = manifest[Int]
val BooleanManifest = manifest[Boolean]
val StringManifest = manifest[String]
m("hello")._2.typeArguments match {
    case List(IntManifest, StringManifest) =>
        m("hello")._1.asInstanceOf[(Int) => String](5)
    case List(BooleanManifest, StringManifest) =>
        m("hello")._1.asInstanceOf[(Boolean) => String](true)
    case _ => "Unknown function type"
}

String не является подклассом Any => String, скорее наоборот. Вы не можете поставить (заменить) функцию ; String, когда код ожидает Any => String, поскольку этот код может применять функцию, скажем, «hi».

Предложение @Ben работает, но как оно полезно? Вы не можете вызвать функцию, как только вы получите ее с карты.

Если вы действительно хотите это сделать, возможно, определите foo как частичную функцию:

val foo: PartialFunction[Any, String] = {case i: ; ....}

Очевидно, что это потерпит неудачу во время выполнения, если вы передадите ей строку, но вы всегда можете проверить, в порядке ли функция для использования с вашим параметром, используя isDefinedAt. (может быть другая альтернатива, но я не вижу здесь значения)

 IttayD06 янв. 2011 г., 18:38
К сожалению, я не правильно определил foo. Исправлена
 Ben Jackson06 янв. 2011 г., 18:35
Да, я собираюсь опубликовать вопрос "как вы вызываете это?" потому что я не знаю себя.

scala> val m = Map("hello" -> foo _, "goodbye" -> bar _)
m: scala.collection.immutable.Map[java.lang.String,(Boolean with Int) => String] =
                Map((hello,<function1>), (goodbye,<function1>))

scala> m("hello")(8)
<console>:9: error: type mismatch;
 found   : Int(8)
 required: Boolean with Int
       m("hello")(8)
scala> var q = new Boolean with Int
<console>:5: error: illegal inheritance from final class Boolean
       var q = new Boolean with Int

Во всяком случае, то, что вы хотите, это не типAny но универсальный «любого типа», который_:

scala> val mm = Map[String, (_) => String]("hello" -> foo _, "goodbye" -> bar _)
mm: scala.collection.immutable.Map[String,Function1[_, String]] =
               Map((hello,<function1>), (goodbye,<function1>))

Я только что отправил вопрос окак вызывать такие функции потому что я на самом деле не знаю.

Ваш ответ на вопрос