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

时间:2015-03-13 14:32:39

标签: 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 provide me a compile time type somehow?
  type FType = (Int,Int,Double,Double,String) => Unit

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

Scala中是否有类似C ++ decltype的东西可以用于此目的?

1 个答案:

答案 0 :(得分:2)

我不太确定你在这里要做什么,如果我理解正确你想避免两次输入(a:Int, b:Int, x:Double, y:Double, name:String)

如何预先定义FType,然后在fcallF中重复使用?

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,那么这是一个截然不同的问题,但是当你通过调用{{{i}来强制改变类型时,它似乎并非如此。 1}}。

你在Scala中没有func(0,0,0,0,"")因为类型不是一等公民,例如他们可能在伊德里斯。也就是说,您应该能够使用Shapeless和/或宏来编写它。

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

import