1. ホーム
  2. haskell

[解決済み] Haskellの合成演算子(.)とF#のパイプ転送演算子(|>)の比較

2022-11-13 18:55:08

疑問点

F#では、パイプフォワード演算子を使用します。 |> を使うことはかなり一般的です。 しかし、Haskellでは、関数の合成しか見たことがない。 (.) が使われているのを見たことがあります。 私は、それらが 関連 というのはわかるのですが、Haskellでパイプフォワードが使われないのは言語的な理由があるのでしょうか、それとも何か他の理由があるのでしょうか?

どのように解決するのですか?

ちょっと憶測ですが...。

文化 : 思うに |> はF#の文化において重要な演算子であり、おそらく同じように . と同様です。 F#では、関数合成演算子 << がありますが、F#のコミュニティでは ポイントフリースタイル を使う傾向があると思います。

言語の違い : 私は両言語について比較できるほどの知識はありませんが、おそらくlet-bindの一般化のルールはこれに影響するほど十分に異なっているのでしょう。 例えば、F#では時々、次のように書くことを知っています。

let f = exp

はコンパイルできませんので、明示的なエタコンバージョンが必要です。

let f x = (exp) x   // or x |> exp

でコンパイルできるようになります。 これは、ポイントフリー/合成スタイルから、パイプラインスタイルへと人々を誘導することにもなります。 また、F#の型推論はパイプラインを要求することがあり、既知の型が左側に表示されるようになります(例えば ここで ).

(個人的にはポイントフリースタイルは読みにくいのですが、新しいもの、違うものは、慣れるまでは読みにくく感じるものなのでしょう)

私は、どちらの言語も潜在的に実行可能だと思いますし、歴史/文化/事故が、それぞれのコミュニティがなぜ異なるquot;attractor"に落ち着いたのかを定義するかもしれません。