Scala のcompose
関数を記述しようとすると、コンパイル時にエラーが発生します。
val compose = (a: Double => Double, b: Double => Double) = b(a)
":1: エラー: ';' 予期されていましたが、'=' が見つかりました。val comp = (a: Double => Double, b: Double => Double) = b(a)"
この関数はどのように書かれていますか?
Scala のcompose
関数を記述しようとすると、コンパイル時にエラーが発生します。
val compose = (a: Double => Double, b: Double => Double) = b(a)
":1: エラー: ';' 予期されていましたが、'=' が見つかりました。val comp = (a: Double => Double, b: Double => Double) = b(a)"
この関数はどのように書かれていますか?
最後=
を に置き換え=>
ます。シンボルは=>
、値の位置にある場合、関数の実装から引数を分離します。
関数 compose が取るものを宣言しますが、それが返すものは宣言しません。だから私はあなたが何を望んでいるのか分かりません。ここには 2 つの可能性があります。
構成の結果を値に適用したい場合があります。その場合、値が必要です。
scala> val compose = (a: Double => Double, b: Double => Double, arg:Double) => b(a(arg))
compose: (Double => Double, Double => Double, Double) => Double = <function3>
2 つの関数を取り、それらを構成して適用しますarg
。
また、次の 2 つの関数の合成によって生成される関数が必要な場合もあります。
scala> val compose = (a: Double => Double, b: Double => Double) =>
{ x:Double =>b(a(x)) }
compose: (Double => Double, Double => Double) => Double => Double = <function2>
ここで、Function3 の代わりに Function2 があり、最初の引数セットの後のリターンが別の関数であることに注意してください。
少し違った方法で行うことができます:
val compose: (Double => Double, Double => Double) => Double => Double =
(a,b) => { x => b(a(x)) }
ここでの問題の 1 つは=>
、型の位置での の使用が、値の位置での使用とわずかに異なることです。位置の値には引数名が必要であり、これらの引数の型注釈は Scala 推論のヒントであり、戻り値を宣言することはできません。これは推論によって埋められます。したがって、あなたが望んでいたことに私の疑いがあります。
コンパイラに型情報を追加する必要があります。
val compose: (Double => Double, Double => Double) => (Double => Double) = (a, b) => (x => b(a(x)))
scala> val dd1: Double => Double = x => x + x
dd1: Double => Double = <function1>
scala> val dd2: Double => Double = x => x * x
dd2: Double => Double = <function1>
scala> val DD1 = compose(dd1, dd2)
DD1: Double => Double = <function1>
scala> val DD2 = compose(dd2, dd1)
DD2: Double => Double = <function1>
scala> DD1(2)
res0: Double = 16.0
scala> DD2(2)
res1: Double = 8.0
非常に慎重に。現在の状態での定義には、次の 2 つの問題があります。
最初のものは、あなたが見ている例外を生成するものです。実際には、代入演算子を の前b(a)
に置く必要はありません。それを無名関数の本体にしたいので、=>
演算子が必要になります。
val compose = (a: Double => Double, b: Double => Double) => b(a)
ただし、まだ完了していません。bodyb(a)
では、コンパイラがあなたがしていると考えているのは、パラメーターとしてapply
b を使用しているため、次のようになります。a
<console>:7: error: type mismatch;
found : Double => Double
required: Double
val compose = (a: Double => Double, b: Double => Double) => b(a)
ご覧のとおり、 を受け取ることを期待b
していますが、引数として/ ]Double
を渡しています。a
Double => Double
Function1[Double, Double
ですから、あなたが見ているもの、そして次のステップで見られるものを見ているのですが、私はどのように答えるべきか完全にはわかりませんcompose
。にパラメーターを追加することで、多少ごまかすことができますcompose
:
scala> val compose = (a: Double => Double, b: Double => Double, c: Double) => b(a(c));
compose: (Double => Double, Double => Double, Double) => Double = <function3>
scala> compose(x => x * 2, y => y * 2, 2)
res2: Double = 8.0
しかし、それは不正行為です。