Function 函数类型可以通过推理来定义吗?

Function 函数类型可以通过推理来定义吗?,function,scala,type-inference,Function,Scala,Type Inference,Scala类型的推理非常好,而且很容易习惯,不必写两次东西。当你不得不这样做的时候,它就越痛。函数类型就是这样一个例子 有时我想为一些函数签名创建一个命名类型。有可能吗?是否有某种方法可以获取函数的编译时类型,以便在定义FType时不必再次键入它 object Foo { def f(a:Int, b:Int, x:Double, y:Double, name:String) : Unit = {} //type FType = typeOf(f) // can compiler pr

Scala类型的推理非常好,而且很容易习惯,不必写两次东西。当你不得不这样做的时候,它就越痛。函数类型就是这样一个例子

有时我想为一些函数签名创建一个命名类型。有可能吗?是否有某种方法可以获取函数的编译时类型,以便在定义
FType
时不必再次键入它

object Foo {
  def f(a:Int, b:Int, x:Double, y:Double, name:String) : Unit = {}

  //type FType = typeOf(f) // can compiler provide me a compile time type somehow?
  type FType = (Int,Int,Double,Double,String) => Unit

  def callF( func:FType) = func(0,0,0,0,"")
}

斯卡拉有什么类似的C++可以用于这个目的吗?

< p>我不太清楚你在这里想要达到什么,如果我正确理解你想要避免打字<代码>(A:int,b:int,x:双,y:双,名字:字符串)< /C> >两次。< /P> 先定义
FType
自己,然后在
f
callF
中简单地重用它,怎么样

object Foo {
  type FType = (Int,Int,Double,Double,String) => Unit

  def f: FType = (a, b, x, y, name) => ()

  def callF(func: FType) = func(0,0,0,0,"")
}
如果您确实想对
FType
进行抽象,这是一个明显不同的问题,但似乎不是这样,因为您通过调用
func(0,0,0,0,“”)
来强制类型

Scala中没有
decltype
,因为类型不是像Idris中那样的一等公民。也就是说,您应该能够使用和/或宏来编写它

如果要修复类型和参数并重用它们,最简单的解决方案是将它们转换为
案例类。然后,您可以使用
import
直接访问字段:

object Foo {
  case class FArgs(a: Int, b: Int, x: Double, y: Double, name: String)

  def f(args: FArgs): Unit = {
    import args._
    println(name) // or whatever you want to do
  }

  def callF(func: FArgs => Unit) = func(FArgs(0,0,0,0,""))
}

这无疑是一个进步,但我还是要写这个
(a,b,x,y,name)
,这有点重复我自己。相反,从
f
推断
FType
可以避免这种情况,但我想这是不可能的。。。不,我不想对
FType
进行抽象,我只是想避免在定义
f
及其使用的回调类型时重复我自己。如果您想用
FType
类型定义多个函数,并且希望它们不仅具有相同的类型,而且具有相同的参数名称,这是我能想到的唯一重复,那么您应该简单地定义一个case类。类似于
case类FArgs(a:Int,b:Int,x:Double,y:Double,name:String)
case类绝对是个好主意。它们的一个小缺点是必须在case类中使用点运算符访问参数,但这似乎是合理的。这可能也会影响性能(创建更多的对象并进行垃圾收集),但对于大多数代码来说,这应该是可以接受的。对于导入参数,这听起来是一个很好的解决方案。你介意把这种方法纳入答案吗?