Scala 功能2和功能3的润滑脂特性

Scala 功能2和功能3的润滑脂特性,scala,Scala,我有一个类型为的函数 (String, String) => String (String, String, String) => String 和另一个具有类型的函数 (String, String) => String (String, String, String) => String 有没有一种方法可以干净地创建一个公共特性/超类,这样我就可以传递它们的列表 编辑: 我正在传递更多关于这方面的信息,因为专家们对我的问题很好奇,我想把上面两种类型添加到一个列

我有一个类型为的函数

(String, String) => String
(String, String, String) => String
和另一个具有类型的函数

(String, String) => String
(String, String, String) => String
有没有一种方法可以干净地创建一个公共特性/超类,这样我就可以传递它们的列表

编辑: 我正在传递更多关于这方面的信息,因为专家们对我的问题很好奇,我想把上面两种类型添加到一个列表中。我试图将它们((String,String)=>String和(String,String,String)=>String)添加到一个列表中,因为我正在创建一个测试套件,它获取一个表列表并运行一个检查条件的方法(条件就是方法)

所以我试图创建一个这样的类

type DatabaseName = String
type TableName = String
type ColName = String
type Output = String

class TestFn(functionName : String, listOfTables : List[String], functionToRun : (DatabaseName, TableName) => Output)
我获取输出并将其存储为数据帧。我希望这是可扩展的。另一个开发人员向我展示了一个包含此签名的测试用例

(DatabaseName, TableName, ColName) => String

因此,我希望能够创建一个超类/trait,以便它可以接受任何函数((String,String)=>String或(String,String,String)=>String),并在他的表列表中运行该函数

  • 你真的有方法或实函数吗
  • 您可以修改功能代码,还是应该保持不变
  • 为什么要将它们包装在
    列表中
    ?你希望达到什么目的?(这看起来很经典。)
  • 当从
    列表中提取时,您如何想象调用这些函数
  • 根据您提出的问题,让我们从两个类型别名开始,以使代码更易于阅读,并对每个别名进行简单(有些愚蠢)的实现

    type Str2Func = (String,String) => String
    type Str3Func = (String,String,String) => String
    
    val s2f:Str2Func = (x,y) => x.toUpperCase + y.toLowerCase
    val s3f:Str3Func = (x,y,z) => z + y + x
    
    将它们放入
    列表后
    我们可以看到这些类型的当前LUB(最小上限)

    List(s2f, s3f)  //List[Object]
    
    不是很有用,但是,很难想象一个LUB可以同时覆盖这两种类型并执行(调用)这两种类型

    一种可能的解决方案是将每个
    Str2Func
    升级为一个只忽略其一个参数的
    Str3Func

    这种转换可以自动完成,但隐式转换可能是危险的,而且是危险的,因此我们将使转换显式但不引人注目

    implicit class SF2to3(f2:Str2Func) {
      def to3: Str3Func = (a:String, b:String, _:String) => f2(a,b)
    }
    
    val s3fs:List[Str3Func] = List(s2f.to3, s3f)
    
    每个元素都可以独立调用

    s3fs.map(_("Aa","Bb","Cc"))
    //res0: List[String] = List(AAbb, CcBbAa)
    

    我怀疑它,除非你想要
    任何
    ,因为你以后无论如何都得投它。你需要这个做什么?可能有一个解决方案。你如何调用这样的函数?考虑在这些函数上调用<代码> tuple < /代码>,这样你就可以做<代码> [tString ] < /代码>。我只推荐一个<代码>列表[String ]。
    ,但是。我不认为使用同质元组有多大意义。您仍然没有回答我的问题,假设您能够在一个列表中同时拥有两个函数,您将如何调用它们?如果您只传递两个参数,但列表中有三个参数,那么您将缺少一个,除非您有一个defaullt,如果您传递了三个,并且函数是两个函数中的一个它会忽略一个,或者你想检查它是两个还是三个的函数来决定如何调用它?或者每个函数都应该已经定义了它的参数,而你只想延迟它的执行?或者…-那么,你怎么可以这样做一个函数?你可以使用
    或者[(String,String)=>String,(String,String,String)=>String]
    ,但正如@LuisMiguelMejíaSuárez所说,您还应该在这个问题中添加如何使用函数。谢谢,我添加了更多信息,请检查。