【问题标题】:Define function with any kind of parameters and known return type使用任何类型的参数和已知的返回类型定义函数
【发布时间】:2017-05-11 13:27:16
【问题描述】:

我确信应该存在这样的东西,但我只是不知道如何表达它。

那么有没有办法定义一个通用函数,它可以接受任意数量的任何类型的参数(从零开始)并返回一个已知类型的值?所以如果我们定义

f: <something_here> => Int

任何返回Int 的函数都应该满足这个要求。

【问题讨论】:

    标签: scala function types parameters


    【解决方案1】:

    不,没有,但不会失去类型安全性(假设我正确理解了您的问题)。最终,使用类型值的唯一方法例如String =&gt; Int 是为其apply 方法提供String,但是您怎么知道要为“返回Int 的任何函数”提供什么类型的参数?

    如果你愿意失去类型安全(你不应该),你可以用类似的东西来实现它

    class UnsafeFunction[A] {
      def apply(xs: Any*): A
    }
    
    object UnsafeFunction {
      implicit def fromF1[A, B](f: A => B): UnsafeFunction[B] = new UnsafeFunction[B] { 
        def apply(xs: Any*) = f(xs(0).asInstanceOf[A])
      }
      implicit def fromF2[A, B, C](f: (A, B) => C): UnsafeFunction[C] = new UnsafeFunction[C] { 
        def apply(xs: Any*) = f(xs(0).asInstanceOf[A], xs(1).asInstanceOf[B])
      }
      ...
    }
    

    这允许将返回Int 的任何函数分配给UnsafeFunction[Int] 类型的值,或将其传递给接受此类参数的方法。同样,我非常不建议在实践中使用它。

    可以有用的是使用泛型类型,例如A =&gt; Int(A, B) =&gt; Int,其中A 是您的类型或方法的类型参数。 Scala 本身不允许您统一具有不同数量参数的函数,但有一个库可以做到这一点:Shapeless。不幸的是,使用它绝非易事。

    【讨论】:

      【解决方案2】:

      我认为这样做可以:

      def f[T](x:T*): Int = ???
      

      它接受任意数量的T 类型的参数并返回Int。在函数中,您可以访问变量xSeq[T],因此可以相应地处理参数。

      但您可能想要定义 T 类型的上限,具体取决于您想对它们做什么。

      【讨论】:

        【解决方案3】:

        您可以编写一个函数,它可以将Any 作为参数,并将 Int 作为返回类型 例如

        def f(x: Any*) : Int = x.length
        

        上面的函数接受任意数量的任意类型的参数并返回传递的参数数量 你可以执行它 -

        f(1,2,3) // This will return 3
        f(1,'b') // This will return 2
        

        希望这能澄清你的疑问!

        【讨论】:

          猜你喜欢
          • 2011-07-17
          • 2021-03-18
          • 2018-07-29
          • 1970-01-01
          • 2011-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-30
          相关资源
          最近更新 更多