0

これが機能するように、scalaでisFunction関数を作成するにはどうすればよいですか?

def isFunction(x:Any) = /* SomeCode */

println(isFunction(isFunction _)) //true
println(isFunction("not a function")) //false
4

3 に答える 3

5

かなり醜いですが、それは機能します:

def isFunction(x:Any) = x match {
  case _: Function0[_] => true
  case _: Function1[_, _] => true
  case _: Function2[_, _, _] => true
  ...
  case _: Function22[...] => true
  case _: PartialFunction[_, _] => true
  case _ => false
}
于 2012-07-10T21:38:58.930 に答える
1

Scalaでは、関数をパブリックメソッドを持つ単なるオブジェクトとして表示できますapply。私は新しいscala2.10リフレクションAPIに精通していませんが、従来のJavaの方法をいつでも次のように使用できます。

def isFunction(x:Any) = x.getClass.getMethods.map(_.getName).exists{name => 
  name == "apply" || name.startsWith("apply$")
}

val set = Set(1, 2)
val str = "abc"
val func = { _:Int=> 1 }
val map = Map(1 -> 2)
val tuple = 1->2
val obj = new { def apply = 1 }
val obj2 = new { private def apply = 2 } 

assert(isFunction(set))
assert(!isFunction(str))
assert(isFunction(func))
assert(isFunction(map))
assert(!isFunction(tuple))
assert(isFunction(obj))
assert(!isFunction(obj2))
于 2012-07-11T04:33:43.157 に答える
0

私はあなたのソリューションの特別なファンではなく、DanielSobralのコメントに同意します。もし私がそれを実装しなければならなかったら、私は暗黙の変換を通して、タイプセーフな方法でそれをするでしょう

trait IsFunctionable {
  def isFunction : Boolean
}

object IsFunctionable {

  object IsFunction extends IsFunctionable {
    def isFunction = true
  }

  object IsNotFunction extends IsFunctionable {
    def isFunction = false
  }

  implicit def function0ToIsFunctionable[A<:Function0[_]](a:A):IsFunctionable = IsFunction
  implicit def function1ToIsFunctionable[A<:Function1[_,_]](a:A):IsFunctionable = IsFunction
  implicit def function2ToIsFunctionable[A<:Function2[_,_,_]](a:A):IsFunctionable = IsFunction
  // and so on

  implicit def anyToIsFunctionable[A](a:A):IsFunctionable = IsNotFunction
}

そして今、あなたはreplで楽しくテストすることができます:

scala>  import IsFunctionable._
import IsFunctionable._

scala>  val a: Int => Int = _ * 2
a: Int => Int = <function1>

scala>  val b: (Int,Int) => Int = (_*_)
b: (Int, Int) => Int = <function2>

scala>  a(3)
res0: Int = 6
scala>  b(2,4)
res3: Int = 8

scala>  a.isFunction
res4: Boolean = true

scala>  b.isFunction
res5: Boolean = true

scala>  "Hello".isFunction
res6: Boolean = false
于 2012-07-11T12:59:37.980 に答える