这是有问题的代码。
下面包含了描述/探索的内容object Functions { import scala.reflect.Manifest private var functions: List[(Manifest[_],Any,String)] = List() def add[T](desc: String,func: T)(implicit m: Manifest[T]) { functions ::= (m,func,desc) } def get[T]()(implicit m : Manifest[T]): List[(T,String)] = { functions flatMap { case (t,f,s) => if (t <:< m) Some(f.asInstanceOf[T],s) else None } } def getInputs[T]()(implicit m : Manifest[T]): List[(T => Any,String)] = { functions flatMap { case (t,f,s) => if (t <:< (T => Any)) Some(f.asInstanceOf[T => Any],s) else None } }
基本上我的目标是拥有一个函数列表,它们的类型(输入和输出)是持久的,并且能够根据它们作为输入所采用的内容以及它们作为输出所采用的内容来搜索特定函数。我开始相信,如果没有某种猴子补丁,这在scala中是不可能的,我想避免。
答案 0 :(得分:4)
您应该可以使用shapeless的HLists
,
示例REPL会话,
scala> import shapeless._
import shapeless._
scala> val f1 : String => Int = _.length
f1: String => Int = <function1>
scala> val f2 : Boolean => Boolean = !_
f2: Boolean => Boolean = <function1>
scala> val f3 : Int => String = "("+_+")"
f3: Int => String = <function1>
scala> val fs = f1 :: f2 :: f3 :: HNil
fs: (String => Int) :: (Boolean => Boolean) :: (Int => String) :: HNil =
<function1> :: <function1> :: <function1> :: HNil
scala> val args = "foo" :: true :: 23 :: HNil
args: String :: Boolean :: Int :: HNil = foo :: true :: 23 :: HNil
scala> fs zipApply args
res0: Int :: Boolean :: String :: HNil = 3 :: false :: (23) :: HNil
请注意,HList
fs
中保留了各种类型的函数,args
中保留了各种类型的参数值,以及元素的类型zipApply
的结果由相应函数和参数的类型适当确定。