1

私は関数型プログラミングを調査してきましたが、メソッドを持つ(不変の)オブジェクトを持ち、したがってメソッドチェーンをサポートする関数型言語が存在する可能性があることに気づきました(チェーン可能なメソッドは、メソッドのインスタンスを変更するのではなく、新しいインスタンスを返します)が呼び出されて返されます)。

これには、読みやすさの利点があります...

o.f().g().h()

... 間違いなく以下よりも読みやすい:

h(g(f(o)))

また、特定の関数を特定のタイプのオブジェクトに関連付けることもできます。これらのタイプのメソッドを作成することで可能になります (オブジェクト指向言語の利点の 1 つであると私は理解しています)。

このように動作する言語はありますか? これが悪い考えだと信じる理由はありますか?

(Javascript などでこのようにプログラムできることは知っていますが、Javascript は不変性を強制しません。)

4

4 に答える 4

2

はい、たとえば、F# はフォワード パイプ (|>) 演算子を使用しているため、コードが非常に読みやすくなっています。例えば、

(1..20)
  |> Seq.map(functionFoo)
  |> Seq.map(functionBoo)

等々...

于 2013-01-29T19:47:38.030 に答える
1

Fregeにはこれがあり、TDNR (型指定名前解決) として知られています。具体的には、 x の型が T で、 y が T の名前空間にある場合、は、 x に適用された名前空間 T からの平易な英語の yx.yと同じです。(T.y x)

これの実用的なアプリケーションは次のとおりです: レコード フィールドへのアクセスとネイティブ (つまり、Frege が Java にコンパイルされているので Java) メソッドへのアクセスのための便利な構文。

于 2013-01-29T19:42:15.553 に答える
0

Scalaはぴったりのように思えます。これは関数型/オブジェクト指向のハイブリッド言語です。

于 2014-01-13T21:24:24.863 に答える
0

そのためのオブジェクトは必要ありません。ほとんどの関数型言語で許可されている独自の逆適用中置演算子を定義するだけです。その後、カリー化が残りを行います。たとえば、OCaml では次のようになります。

let (>>) x f = f x

デモ:

let f x y z = z * (x - y)
let g x = x + 1
let h x y = y * x

5 >> f 6 2 >> g >> h 2  (* = h 2 (g (f 6 2 5)) *)

(または、お好みの演算子名を選択してください。たとえば、他の人が使用|>します。)

于 2014-01-14T08:21:44.503 に答える