我是Scala的新手。我遇到了这个问题: 如果不考虑副作用(输出,全局变量......),下面的方法可以有多少实现?我怎么能弄明白呢?
def g[A,B,C](x: A,y: B,f:(A,B) => C): C
答案 0 :(得分:0)
一般情况下,您可以从退货类型向后退一步,这样就可以查看C
并尝试查找它的来源,我们可以看到f
本身返回{ {1}},但它需要我们给它C
和A
,所以现在我们寻找那些,我们只发现它们一次,这给了我们答案只有一种方法可以产生B
,因此只有一种方法可以实现这个功能。如果我们有两个C
值,我们会得到两个不同的实现。
现在当然这种情况忽略了你使用A
或使用null
强制转换的无数种方式实现它的事实。因此,如果你必须非常精确,那么这个函数就有1个实现。
答案 1 :(得分:0)
即使没有null
s,asInstanceOf
和抛出异常,这个问题也是不适定的。对于每个自然数n
,您只需将.swap.swap
附加到(x, y)
n
次 - 在以下实现中(n
= 1的示例):
def g[A, B, C](x: A, y: B, f: (A, B) => C): C = {
val (xx, yy) = (x,y).swap.swap
f(xx, yy)
}
你可以通过在不同的地方插入任意多个identity
函数来做同样的事情。或者使用_1
,_2
投影和(-,-)
- 构造函数(或者,一般情况下,重复应用非生产性的eta-expansions和beta-reduction of your choice)。