如果我有一个函数:

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)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top