gpt4 book ai didi

scala - 根据 scala 中参数的类型选择函数列表的子集

转载 作者:行者123 更新时间:2023-12-04 18:14:50 25 4
gpt4 key购买 nike

这是有问题的代码。下面包括一些描述/解释

对象功能{
导入 scala.reflect.Manifest
私有(private) var 函数:List[(Manifest[_],Any,String)] = List()
def add[T](desc: String,func: T)(隐式 m: Manifest[T]) {
函数::= (m,func,desc)
}

def get[T]()(隐式 m : Manifest[T]): List[(T,String)] = {
函数平面图 {
case (t,f,s) => if (t <:< m) Some(f.asInstanceOf[T],s) else None
}
}

def getInputs[T]()(隐式 m : Manifest[T]): List[(T => Any,String)] = {
函数平面图 {
case (t,f,s) => if (t <:< (T => Any)) Some(f.asInstanceOf[T => Any],s) else None
}
}

基本上我的目标是拥有一个函数列表,保留它们的类型(输入和输出),并能够根据它们作为输入和作为输出的内容来搜索特定函数。我开始相信如果没有某种猴子补丁,这在 scala 中是不可能的,我想避免这种情况。

最佳答案

你应该可以用 shapeless 做你想做的事的HLists ,

示例 REPL session ,

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 的结果的元素的类型由相应函数和参数的类型适当确定。

关于scala - 根据 scala 中参数的类型选择函数列表的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11936997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com