3

私は関数型プログラミングにかなり慣れていません。私の以前のプログラミング経験は、主に Java でした。

関数型言語で関数を設計する場合、プリミティブとコレクションのどちらを渡す方がよいですか? 関数型言語の知識が不足しているため、どちらを選択しても効果が見えない気がします。

私の意見では、コレクションを渡すと、よりクリーンで直感的なコードになります (たとえば、name、surname などの代わりに person という名前のマップを渡します)。一方、それはコレクション構造の依存関係を作成します。多分それは、そのマップから使用する必要がある情報の量に依存します. わからない...

これが開かれた議論であることは承知していますが、私の主な関心事は、機能を設計するための事実上の方法があるかどうかです。

アップデート1

前に言ったように人物マップがあり、その内容を str したいとしましょう。次のようなことをすると思います。

; 
(def person {:name "John" :surname "Doe"})

(defn str-person
  "Give the full name of a person"
  [person]
  (apply str (interpose ", " (map #(get-in person [%]) [:surname :name]))))
; => Doe, John

; primitive alt
(defn str-person
  "Give the full name of a person"
  [name surname]
  (str surname ", " name))
; => Doe, John

さて、私は最初の解決策が FP に近いものであり、それを拡張することもできると信じていますが、一方で、それは少しやり過ぎのように思えます。

4

3 に答える 3

2

実用性の観点から、私はコレクションとマップを渡すことを好みます。かなり複雑なデータ構造をマップにまとめて、単一の引数として渡すことができます。データのビットを個別の引数として渡すよりも簡単です。これは関数型言語だけに当てはまるわけではありません。手続き型言語やオブジェクト指向言語にも同じ理由が当てはまります。

于 2013-06-25T18:54:32.990 に答える
0

ユースケースによって異なります。

不変の構造を渡している限り、FPがどちらか一方を「好む」とは思いません。そうしないと、FPがほとんど構築されている参照透過性を失う危険があります。

于 2013-06-25T17:07:33.327 に答える