1

Scala のcompose関数を記述しようとすると、コンパイル時にエラーが発生します。

val compose = (a: Double => Double, b: Double => Double) = b(a)

":1: エラー: ';' 予期されていましたが、'=' が見つかりました。val comp = (a: Double => Double, b: Double => Double) = b(a)"

この関数はどのように書かれていますか?

4

3 に答える 3

2

最後=を に置き換え=>ます。シンボルは=>、値の位置にある場合、関数の実装から引数を分離します。

関数 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 推論のヒントであり、戻り値を宣言することはできません。これは推論によって埋められます。したがって、あなたが望んでいたことに私の疑いがあります。

于 2013-07-23T03:44:32.177 に答える
2

コンパイラに型情報を追加する必要があります。

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
于 2013-07-23T03:41:06.040 に答える
0

非常に慎重に。現在の状態での定義には、次の 2 つの問題があります。

最初のものは、あなたが見ている例外を生成するものです。実際には、代入演算子を の前b(a)に置く必要はありません。それを無名関数の本体にしたいので、=>演算子が必要になります。

val compose = (a: Double => Double, b: Double => Double) => b(a)

ただし、まだ完了していません。bodyb(a)では、コンパイラがあなたがしていると考えているのは、パラメーターとしてapplyb を使用しているため、次のようになります。a

<console>:7: error: type mismatch;
 found   : Double => Double
 required: Double
     val compose = (a: Double => Double, b: Double => Double) => b(a)

ご覧のとおり、 を受け取ることを期待bしていますが、引数として/ ]Doubleを渡しています。aDouble => DoubleFunction1[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

しかし、それは不正行為です。

于 2013-07-23T03:31:38.863 に答える