私はF#を使用していますが、多くの場合、これらの言語の間にいくつかの類似点がある点を除いて、Scalaの多くは分かりません。しかし、ScalaでAkka Streamsの実装を見ている間、F#では不可能なように〜>という演算子を使用していました(残念ながら)。私は単項演算子の初めにF#でしか使用できないシンボル "〜"については言及していませんが、これは重要ではありません。さまざまなグラフ要素は、異なるタイプ(ソース、フロー、シンク)を持っているのでScalaではなぜこのような演算子の定義が可能ですか?
in ~> f1 ~> bcast ~> f2 ~> merge ~> f3 ~> out
bcast ~> f4 ~> merge
、それはそれら全体で仕事とF#で、単一の演算子を定義することはできません:何私を感動することは、このようにグラフを定義する可能性があります。 Scalaがなぜメソッド関数のオーバーロード(そしてF#はサポートしていない)をサポートしているのか?
更新。 Fydor Soikinは、F#でオーバーロードするいくつかの方法を示しました。これは、F#を使用するときに同様の構文を実現するために使用できます。私はそれがどのように見えるかをここでこれを試してみました:
type StreamSource<'a,'b,'c,'d>(source: Source<'a,'b>) =
member this.connect(flow : Flow<'a,'c,'d>) = source.Via(flow)
member this.connect(sink: Sink<'a, Task>) = source.To(sink)
type StreamFlow<'a,'b,'c>(flow : Flow<'a,'b,'c>) =
member this.connect(sink: Sink<'b, Task>) = flow.To(sink)
type StreamOp = StreamOp with
static member inline ($) (StreamOp, source: Source<'a,'b>) = StreamSource source
static member inline ($) (StreamOp, flow : Flow<'a,'b,'c>) = StreamFlow flow
let inline connect (a: ^a) (b: ^b) = (^a : (member connect: ^b -> ^c) (a, b))
let inline (>~>) (a: ^a) (b: ^b) = connect (StreamOp $ a) b
今、私たちは次のコードを記述することができます。
let nums = seq { 11..13 }
let source = nums |> Source.From
let sink = Sink.ForEach(fun x -> printfn "%d" x)
let flow = Flow.FromFunction(fun x -> x * 2)
let runnable = source >~> flow >~> sink
F#は完全にサポートメソッドのオーバーロードを行い:-)教訓を学びます。 –