14

関数がある場合:

f : A => B => C

(A, B) => C関数が期待される場所で使用できるように、暗黙的な変換を定義できます。これは逆方向にも行きます。

これらの変換が暗黙的でない (または暗黙的に利用可能でない) のはなぜですか? 私は、悪いことのいくらかの価値のために悪いことが起こる可能性があると仮定しています。これは何の値ですか?

4

2 に答える 2

13

悪いことは起こらないと思います。変換は完全に明確です。最悪の場合、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などに相当するものが必要になる場合があります。

于 2010-08-11T12:38:06.437 に答える
9

デフォルト (常時オン) で暗黙的に利用できるようにしたくない場合は、同様の型の引数でオーバーロードしたときに型システムが問題を解決できないためです。

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?

強力な型付けの利点の 1 つは、愚かなことをしたときに警告を発することです。物事を機能させるために一生懸命努力すると、利益が減少します。ここで、変換が自動的に行われた場合、呼び出すつもりだったメソッドを呼び出さない可能性があります。

要求に応じて暗黙的に利用できるようにすることは問題ありませんが、必要な場合に自分で行うのはそれほど難しくありません。これは私がめったに使用しないものです。ライブラリに入れたいもののトップ 10 またはおそらくトップ 100 には入れません (部分的には、自動カリー化/非カリー化ではなく、タプルへの自動変換を好む可能性があるためです)。

于 2010-08-11T13:46:40.023 に答える