是否可以在Scala中写下依赖函数类型?
发布时间:2020-12-16 09:22:14 所属栏目:安全 来源:网络整理
导读:特定 trait Foo { type Bar} 是否有合法的方式来写出像f:(x:Foo)= x.Bar,所以函数的返回类型取决于参数?使用的一个例子是 def compareOutput(x1: Foo,x2: Foo)(f: (x: Foo) = x.Bar /* illegal */)(comparer: (x1.Bar,x2.Bar) = Boolean) = { val y1 = f(
特定
trait Foo { type Bar } 是否有合法的方式来写出像f:(x:Foo)=> x.Bar,所以函数的返回类型取决于参数?使用的一个例子是 def compareOutput(x1: Foo,x2: Foo)(f: (x: Foo) => x.Bar /* illegal */)(comparer: (x1.Bar,x2.Bar) => Boolean) = { val y1 = f(x1) val y2 = f(x2) comparer(y1,y2) } 解决方法
Scala没有像Haskell那样的多态函数.功能类型总是具体的.只有方法可以是多态的.那不幸的是,你的假设类型(x:Foo)=> xba在Scala中不可表达.
将泛型方法转换为函数时变得很明显:所有类型的信息都丢失: scala> def foo[Bar](x: Bar): Bar = ??? foo: [Bar](x: Bar)Bar scala> foo _ res1: Nothing => Nothing = <function1> 您可能还注意到Scala确实无法将依赖类型的方法转换为函数.那是因为不可能满足你的假设类型: scala> def foo(x: Foo): x.Bar = ??? foo: (x: Foo)x.Bar scala> foo _ <console>:10 error: method with dependent type (x: Foo)x.Bar cannot be converted to function value. 另请参阅this和this问题. 然而,您的问题有几种解决方案.一个是将您的依赖类型的方法封装在帮助特征中: trait FooFunc { def apply(x: Foo): x.Bar } def compareOutput(x1: Foo,x2: Foo)(f: FooFunc)(comparer: ...) = { val y1 = f(x1) val y2 = f(x2) comparer(y1,y2) } 然后,您可以创建FooFunc的实例,您可以将其传递给compareOutput方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |