【问题标题】:Can function type be defined by inference?函数类型可以通过推理来定义吗?
【发布时间】:2015-05-16 02:15:05
【问题描述】:

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 的东西可以用于此目的?

【问题讨论】:

    标签: function scala type-inference


    【解决方案1】:

    我不太确定您在这里要达到什么目的,如果我理解正确,您希望避免输入两次 (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 进行抽象,这是一个截然不同的问题,但情况似乎并非如此,因为您通过调用func(0,0,0,0,"") 来强制类型。

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

    如果你想修复类型和参数并重用它们,最简单的解决方案是将它们变成case class。然后您可以使用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 class FArgs(a: Int, b: Int, x: Double, y: Double, name: String)
    • 案例类绝对是个好主意。他们的一个小缺点是必须在案例类中使用点运算符访问参数,但这似乎是合理的。也可能会影响性能(创建更多对象并收集垃圾),但对于大多数代码来说它们应该是可以接受的。
    • 使用 import args._ 听起来是个不错的解决方案。您是否愿意将这种方法纳入答案?
    猜你喜欢
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多