Function 函数类型可以通过推理来定义吗?
Scala类型的推理非常好,而且很容易习惯,不必写两次东西。当你不得不这样做的时候,它就越痛。函数类型就是这样一个例子 有时我想为一些函数签名创建一个命名类型。有可能吗?是否有某种方法可以获取函数的编译时类型,以便在定义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
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类中使用点运算符访问参数,但这似乎是合理的。这可能也会影响性能(创建更多的对象并进行垃圾收集),但对于大多数代码来说,这应该是可以接受的。对于导入参数,这听起来是一个很好的解决方案。你介意把这种方法纳入答案吗?