1

MWE(obs .: cを呼び出すたびにクラスをインスタンス化する必要がないので、関数が必要です):

object Main extends  App {
     def a(s:String, i:Int) ={
        s + i * i         //some complex op that yields String
     }

     def b(i:Int) ={
        i / 3             //another complex op that yields Int
     }

     def c(f: Any => Any) = { 
        val L = List(1,2,3,4) //list of complex elements
        L map f               //apply f within some complex loop
     }

     println(c(a))
     /*
        scala: type mismatch;
        found   : (String, Int) => String
        required: Any => Any
        println(c(a))
                  ^
      */

     println(c(b))
     /*
        scala: type mismatch;
        found   : Int => Int
        required: Any => Any
        println(c(b))
                  ^
     */
}

おそらく、同等の質問は、「ある種の関数の継承はありますか?」のようになります。

def f
def fa(i: Int):String extends f
def fb(s: String):Int extends f
4

2 に答える 2

2

あなたがやろうとしていることはタイプセーフではありません。なぜなら、もしそうなら、パラメータStringを取る関数にを渡すことができるからです。Int

例えば

def c(f: Any => Any) = { 
    val L = List("a", "b", "c")
    L map f
}

c(a)

Int => Anyただし、より派生した型をに割り当てるのが安全であるため、型の関数をとることができますAny

def c(f: Int => Any) = {
    val l = List(1,2,3,4)
    l.map(f)
}

これで安全になりました:

val bList: List[Any] = c(b)

ただし、1つではなく2つの引数が必要なため、パスaすることはできません。最初の引数をc部分的に適用して、それを渡すことができます。String

val cList = c(a("SomeString", _:Int))
于 2013-02-02T19:08:20.207 に答える
1

を使用していることに気付いた場合はAny

  1. あなたはおそらく何か間違ったことをしている、そして
  2. ほとんどの場合、ジェネリックが必要です。

あなたの場合

def c[X,Y](f: X => Y) = { ... }

その複雑なループの中に何があるかに応じて、おそらくトリックを行うでしょう。

于 2013-02-02T21:27:48.080 に答える