なぜカリーとアンカリは、スカラに暗黙的ではないのですか
-
27-09-2019 - |
質問
関数がある場合:
f : A => B => C
関数がある場合に使用できるように、暗黙の変換を定義できます (A, B) => C
期待されています。これも他の方向に進みます。
なぜこれらの変換がそうではないのか 暗黙 (または暗黙的に利用可能)?私はそれを仮定しています 悪いことが起こる可能性があります 悪いことの価値のために。これはどのような価値がありますか?
解決
悪いことは何も起こらないと思います。変換は完全に明確です。最悪の場合、Scalaは暗黙の変換が適用されることを理解することができません。
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)
しかし、今では変換はあいまいです。だからそれはすべてのバラではありません。
それが実際にどのように機能するかを教えてください。 function3、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?
強力なタイピングの利点の一部は、愚かなことをしたときに警告することです。物事を機能させるために一生懸命努力することは、利点を減らします。ここでは、変換が自動的に行われた場合、呼び出すことを意図した方法を呼び出さない場合があります。
リクエストに応じて暗黙的に利用できることは問題ありませんが、必要に応じて自分でやるのはそれほど難しくありません。これは私が非常にまれに使用するものです。私はそれを私のトップ10に、またはおそらく私が図書館で望む一番上のものにさえそれを置くことはありません(一部は、自動カレー/アンカリの代わりにタプルへの自動変換を好むかもしれないからです)。