为什么钻营和uncurrying Scala中不隐
-
27-09-2019 - |
题
如果我有一个函数:
f : A => B => C
我可以定义使得该情况下可以使用一个功能(A, B) => C
预期的隐式转换。这正好在另一个方向上也
为什么这些转化不隐式(或可用的隐式地)?我假设的不好的事情会发生作为不好的事情一定的价值。什么值,这是?
解决方案
我不认为会发生什么不好。转换是完全明确的。最坏的情况下,斯卡拉将不能弄清楚,隐式转换适用。
implicit def curryImplicitly[A,B,C](f: (A, B) => C) =
(a: A) => (b: B) => f(a, b)
implicit def uncurryImplicitly[A,B,C](f: A => B => C) =
(a: A, b: B) => f(a)(b)
再说,这些也将是有益的。
implicit def flipImplicitly[A,B,C](f: (A, B) => C) =
(b: B, a: A) => f(a, b)
implicit def flipImplicitlyCurried[A,B,C](f: A => B => C) =
(b: B) => (a: A) => f(a)(b)
但这些都不是传递的,所以你需要这些:
implicit def flipAndCurry[A,B,C](f: (A, B) => C) =
(b: B) => (a: A) => f(a, b)
implicit def flipAndUncurry[A,B,C](f: A => B => C) =
(b: B, a: A) => f(a)(b)
但是,现在的转换是不明确。因此,它是不是所有的玫瑰。
让我们知道它是如何工作了实践中。您可能需要等价物功能3,Function4等。
其他提示
您不想让他们默认(常开)隐含可用,因为那么该类型系统有故障,帮助你来的时候,你已经超负荷了一堆类似类型的参数:
A => B => C
D => C // D is allowed to be a tuple (A,B)...
(A,B) => C // If I have this, to whom should I convert?
这是强类型的优势,一部分是警告你,当你已经做了一些愚蠢的。太艰苦设法使事情的工作降低的好处。在这里,如果转化率自动完成,你可能不叫你的意思是要调用的方法。
让他们根据要求提供隐是好的,但它并不难做到这一点吧,如果你需要它。这是什么,我会用很罕见;我不会把它放在我的前十名或者甚至可能百强的事情,我在图书馆喜欢的(部分原因是因为我可能更喜欢自动转换为一个元组,而不是自动钻营/ uncurrying)。
不隶属于 StackOverflow