タグ付けされた質問 「functional-programming」

関数型プログラミングは、プログラムの状態ではなく入力によって出力が決定される関数の連鎖評価によって計算問題を解決しようとするパラダイムです。このプログラミングスタイルでは、副作用と可変データは廃止され、通常は厳密に分離されます。

9
有害と考えられる返品?コードがなくてもコードは機能しますか?
さて、タイトルは少しクリックされていますが、真剣に私は言いました、しばらくキックを求めないでください。私は、メソッドが真のオブジェクト指向の方法でメッセージとして使用されることを奨励する方法が好きです。しかし、これには頭の中のガタガタする問題があります。 よく書かれたコードは、オブジェクト指向の原則と機能の原則を同時に満たすことができると疑うようになりました。私はこれらの考えを調和させようとしています、そして、私が着陸した大きなこだわりポイントはreturnです。 純関数には次の2つの性質があります。 同じ入力で繰り返し呼び出すと、常に同じ結果が得られます。これは、不変であることを意味します。その状態は一度だけ設定されます。 副作用はありません。呼び出しによって引き起こされる唯一の変更は、結果の生成です。 それでは、return結果を伝える方法として使用することを誓った場合、どうすれば純粋に機能的になりますか? TELLは、聞いていない、いくつかの副作用を検討するものを使用してアイデアの作品を。オブジェクトを扱うとき、その内部状態については尋ねません。何をする必要があるかを伝え、その内部状態を使用して、私がそれを行うように指示したことで何をすべきかを見つけます。一度言ったら、何をしたのかは聞かない。私は、それがするように言われたことについて何かをしたと思っています。 Tell、Den's Askは単にカプセル化の別の名前以上のものだと思います。私が使うとき、私はreturn何が私を呼んだのかわかりません。私はそれのプロトコルを話すことができません、私はそれが私のプロトコルに対処することを強制する必要があります。多くの場合、これは内部状態として表されます。公開されているものが正確な状態ではない場合でも、通常は状態と入力引数に対して実行される計算にすぎません。応答するインターフェースがあると、結果を内部状態や計算よりも意味のあるものにマッサージする機会が与えられます。それはメッセージパッシングです。この例を参照してください。 昔、ディスクドライブには実際にディスクが搭載されていて、指で触れるにはホイールが冷たすぎるときに親指ドライブが車で行っていたものでした。void swap(int *first, int *second)とても便利に見えましたが、結果を返す関数を書くことが奨励されました。それで私はこれを信仰で心に留め、それを追い始めました。 しかし、今では、オブジェクトを構築する方法によって結果の送信先を制御できるアーキテクチャを構築する人々がいます。以下に実装例を示します。出力ポートオブジェクトを注入することは、出力パラメーターの考え方に似ています。しかし、それが、tell-don't-askオブジェクトが他のオブジェクトに何をしたかを伝える方法です。 副作用について最初に学んだとき、それを出力パラメーターのように考えました。私たちは、仕事のいくつかを驚くべき方法で、つまりreturn result慣習に従わないことによって人々を驚かせないように言われていました。確かに、副作用が発生する並列非同期スレッドの問題が山積みになっていることはわかっていますが、戻り値は実際には単に結果をスタックにプッシュしたままにしておくため、呼び出されたものは後でポップオフできます。それだけです。 私が本当に求めていること: あるreturnすべてのその副作用の悲惨さを回避し、ロックせずに、スレッドの安全性を取得する唯一の方法は、など、または私は従うことができます聞いていない、言う純粋に機能的な方法で?

2
なぜ実存型は関数型プログラミングの悪い習慣と見なされているのですか(または、そうでないのですか)?
一貫してコードをリファクタリングして存在型への依存を排除​​するために使用できるテクニックは何ですか?通常、これらは、あなたのタイプの望ましくない構造を不適格にし、特定のタイプに関する最小限の知識で消費を許可するために使用されます(または私の理解もそうです)。 誰もがいくつかの利点を維持しているコードのこれらへの依存を削除するためのシンプルで一貫した方法を考え出しましたか?または、少なくとも、変更に対処するために重要なコードチャーンを必要とせずにそれらを削除できる抽象化をすり抜ける方法はありますか? 存在タイプの詳細については、こちらをご覧ください(「あえて」。)。

7
FP以外の人が少量の関数型プログラミングを理解できるか?[閉まっている]
事例:私は会社で働いており、配列で大量のデータを処理するPythonでアプリケーションを作成しています。私は現時点でこのプログラムの唯一の開発者ですが、おそらく他のプログラマーによって将来(1〜3年)に使用/変更/拡張される可能性があります。私はおそらく直接その場にいませんが、時間があれば電子メールでサポートを提供するかもしれません。 そのため、関数型プログラミング(Haskell)を学んだ開発者として、たとえば次のようなフィルタリングを解決する傾向があります。 filtered = filter(lambda item: included(item.time, dur), measures) コードの残りの部分はオブジェクト指向です。私にとっては、はるかに単純で美しいため、このように解決したいのはほんの一部のケースです。 質問:今日このようなコードを書いても大丈夫ですか? FPを作成/学習していない開発者は、このようなコードにどのように反応しますか? 読みやすいですか? 変更可能ですか? 行が何をするのかを子供に説明するようなドキュメントを書くべきですか? # Filter out the items from measures for which included(item.time, dur) != True 上司に聞いたところ、「FPは黒魔術ですが、うまく機能し、最も効率的なソリューションであれば、使用しても構いません」と彼は言います。 これについてのあなたの意見は何ですか?非FPプログラマーとして、コードにどのように反応しますか?コードは「グーグル可能」であるため、その機能を理解できますか?これに関するフィードバックをお待ちしています。

3
「究極のラムダ」というフレーズの起源と意味は何ですか?
私は数年前から関数型プログラミング言語をいじり続けてきましたが、このフレーズに出会っています。たとえば、これは「The Little Schemer」の章であり、これは確かにこの名前でブログに先行します(いいえ、この章は私の質問に答える助けにはなりません。) 私はラムダの意味を理解しています。匿名関数の概念はシンプルかつ強力ですが、このコンテキストで「究極」が何を意味するのか理解できません。 私がこのフレーズを見た場所: The Little Schemerの第8章のタイトル ブログ:http : //lambda-the-ultimate.org/ 一連の「Lambda the ultimate X」ペーパー:http : //library.readscheme.org/page1.html ここに参照がありませんが、誰か助けてもらえますか?

7
同じ入力が常に同じ出力を返すだけでなく、副作用がある関数を何と呼びますか?
次のような通常の純粋な関数があるとします function add(a, b) { return a + b } そして、副作用があるように変更します function add(a, b) { writeToDatabase(Math.random()) return a + b; } 私の知る限り、純粋な関数とは見なされていません。なぜなら、人々は純粋な関数を「副作用のない関数」と呼ぶことがよくあるからです。ただし、同じ入力に対して同じ出力を返すという点では、純粋な関数のように動作します。 このタイプの関数には別の名前がありますか、名前が付けられていないのですか、それとも実際には純粋であり、純度の定義について間違っていますか?


7
関数型プログラミングが増えていますか?
私は最近、関数型プログラミング言語の人気が高まっていることに気付きました。Tiobe Indexの人気が昨年と比較してどのように増加しているのかを最近見ましたが、このインデックスによると、それらのほとんどは最も人気のある上位50言語にさえ達していません。 そして、これはかなり以前からそうでした。関数型プログラミングは、他のモデルほど普及していません(つまり、オブジェクト指向プログラミング)。 関数型プログラミングの力に生まれ変わりましたが、マルチコアの人気が高まっているため、開発者はHaskellやErlangなどの言語で既に検討されている他の並行性モデルに関心を示し始めています。 コミュニティの大きな受け入れがないにもかかわらず、この種の言語がますます出現しているという事実に大きな関心を持っています。Clojure(2007)、Scala(2003)、F#(2002)は、最近の10年間のほんの3つの例です。 私自身、HaskellとScalaを学ぶのに時間を費やしてきました。そして、私は長い間そこにいたにもかかわらず、私にとっては新しいパラダイムに大きな可能性を見出しました。 そしてもちろん、私の最大の質問は、これらのいずれかが努力を検討するのに十分人気があるかどうかですが、これはすべての大騒ぎの人々がそれらについて作っているにもかかわらず、Mandrakeでさえ答えることができない質問です。 私が聞きたいのは: 特定のタスクを実行するのにより適した関数型プログラミング言語を検討すべきシナリオはどれですか?並列プログラミングの最近人気のマルチコア問題に加えて。 関数型プログラミング言語に切り替えることにした場合、私が直面する最大の落とし穴になると思いますか?(パラダイムの変更と、遅延評価によるパフォーマンスの評価の難しさに加えて)。 非常に多くの関数型プログラミング言語がありますが、ニーズに合った言語をどのように選択しますか? さらなる研究のための推奨事項は大歓迎です。 私は意見を求めてウェブを検索しましたが、この新たな人気はすべて、ムーアの法則の壁にぶち当たろうとしているという考えから来ているようです。しかし、そうだとすれば、既存の一般的な言語がパラダイムに適応する可能性はもっと高いと思います。 おそらくこれらの言語を毎日使用する経験が豊富な人の中には、このテーマに関するより多くの洞察を提供できる人もいます。あなたの意見はすべて高く評価され、慎重に検討されます。 前もって感謝します!

8
関数型言語は再帰に優れていますか?
TL; DR:関数型言語は、非関数型言語よりも再帰をうまく処理しますか? 現在、コードコンプリート2を読んでいます。本のある時点で、著者は再帰について警告しています。彼は、可能な場合は避けるべきであり、再帰を使用する関数は一般にループを使用するソリューションよりも効果が低いと言います。例として、著者は再帰を使用してJava関数を記述し、そのように数値の階乗を計算しました(現時点では本が手元にないため、まったく同じではない場合があります)。 public int factorial(int x) { if (x <= 0) return 1; else return x * factorial(x - 1); } これは悪い解決策として提示されます。ただし、関数型言語では、多くの場合、再帰を使用することが推奨される方法です。たとえば、再帰を使用したHaskellの階乗関数は次のとおりです。 factorial :: Integer -> Integer factorial 0 = 1 factorial n = n * factorial (n - 1) そして、良い解決策として広く受け入れられています。私が見たように、Haskellは再帰を非常に頻繁に使用しますが、眉をひそめているものはどこにも見ませんでした。 私の質問は基本的には次のとおりです。 関数型言語は非関数型言語より再帰をうまく処理しますか? 編集:私が使用した例は私の質問を説明するのに最適ではないことを認識しています。Haskell(および関数型言語全般)は、非関数型言語よりも再帰を頻繁に使用することを指摘したかっただけです。

1
機能プログラムの編成方法[終了]
重複の可能性: 関数型プログラミングとOOP 関数型プログラミングで管理可能なコードを記述する方法 OOPでは、コードの組織の基本単位はクラスです。Java、C#、および同様の言語で頻繁に使用される方法論は、クラス名の後にファイル名を付けて、各クラスに1つのファイルを持つようにコードを編成することです。 これらの各クラスは、単一の概念をグループ化する組織の単位と見なすことができます。 これらのクラスは、多くの場合、ソリューション/プロジェクト内のファイルのディレクトリ構造に従う名前空間にあります。名前空間は、組織の別のレベルです。 関数型言語の大規模プロジェクトは通常どのように編成されていますか? 関数を異なるファイルに分割する方法を決定する方法は? ファイル以外のグループ化の他の単位が使用されていますか? コードは通常、単一のファイル内でどのように編成されますか?

5
依存関係の逆転は、高階関数とどのように関連していますか?
今日、F#開発におけるSOLID原則の関連性を説明したこの記事を見ました。 F#および設計原則–ソリッド そして最後の1つである「依存性反転の原理」に取り組んでいる間、著者は次のように述べています。 機能的な観点から、これらのコンテナとインジェクションの概念は、単純な高次関数、または言語に直接組み込まれている中間者型パターンで解決できます。 しかし、彼はそれをさらに説明しませんでした。だから、私の質問は、依存関係の逆転は高階関数にどのように関連していますか?

7
Haskell AND Lisp vs. Haskell OR Lisp [終了]
現在、C、C ++、およびPythonを使用してコーディングしています。関数型プログラミング言語を使いたいと思っていますが、今はHaskellに傾倒しています。ここで「Haskell vs Lisp」戦争を始めたくありません。私が知りたいのはこれです:主に関数型プログラミングに触れるためにHaskellを学んだ場合、後でLispを学ぶことでどんな利益が得られますか?

5
関数型プログラミングの文脈で貧血モデルについて話すことはまだ有効ですか?
DDDの戦術的なデザインパターンのほとんどはオブジェクト指向のパラダイムに属し、貧弱なモデルは、すべてのビジネスロジックがオブジェクトではなくサービスに置かれ、一種のDTOになっている状況を表します。言い換えると、貧血モデルは手続き型の同義語であり、複雑なモデルにはお勧めできません。 純粋な関数型プログラミングの経験はあまりありませんが、DDDがFPパラダイムにどのように適合し、その場合に「貧血モデル」という用語がまだ存在するかどうかを知りたいです。 更新:Recentlry は、このテーマに関する本とビデオを公開しました。

2
純粋に機能的な言語についての誤解はありますか?
私はしばしば次のステートメント/引数に遭遇します: 純粋な関数型プログラミング言語では副作用がありません(したがって、実用的なプログラムは副作用を持っているため、実際にはほとんど役に立ちません。たとえば、外部の世界と対話するときです)。 純粋な関数型プログラミング言語では、状態を維持するプログラムを作成できません(多くのアプリケーションでは状態が必要なため、プログラミングが非常に厄介になります)。 私は関数型言語の専門家ではありませんが、これまでこれらのトピックについて理解してきたことを以下に示します。 ポイント1に関しては、純粋に機能的な言語で環境と対話できますが、副作用を引き起こすコード(関数)を明示的にマークする必要があります(たとえば、モナド型によるHaskellで)。また、私が知っている限り、副作用による計算(データの破壊的な更新)も(モナド型を使用して)可能であるべきです(たとえそれが好ましい作業方法ではないとしても) ポイント2については、いくつかの計算ステップ(Haskellでもモナド型を使用)で値をスレッド化することで状態を表すことができますが、これを行う実際的な経験はなく、私の理解はかなりあいまいです。 それで、上記の2つの文は何らかの意味で正しいのですか、それとも純粋に機能的な言語に関する誤解ですか?それらが誤解である場合、どのようにして生じたのですか?(1)副作用を実装し、(2)状態で計算を実装するHaskellの慣用的な方法を示す(おそらく小さな)コードスニペットを記述できますか?

5
不変性は、マルチプロセッサプログラミングでのロックの必要性を完全に排除しますか?
パート1 明らかに不変性は、マルチプロセッサプログラミングでのロックの必要性を最小限に抑えますが、その必要性を排除しますか、または不変性だけでは不十分な場合がありますか?ほとんどのプログラムが実際に何かを行う(データストアを更新する、レポートを作成する、例外をスローするなど)前に処理を延期し、状態をカプセル化できるのは私だけのようです。そのようなアクションは常にロックなしで実行できますか?元のオブジェクトを変更するのではなく、各オブジェクトを破棄して新しいオブジェクトを作成するという単純なアクション(不変性の大まかな見方)は、プロセス間競合からの絶対的な保護を提供しますか、それともロックが必要なコーナーケースがありますか? 私は多くの機能的なプログラマーと数学者が「副作用なし」について話すのを好むことを知っていますが、「現実の世界」では、機械命令を実行する時間であっても、すべてに副作用があります。理論的/学術的答えと実用的/現実世界の答えの両方に興味があります。 特定の境界または仮定が与えられれば、不変性が安全であれば、「安全ゾーン」の境界が正確に何であるかを知りたいです。可能な境界のいくつかの例: I / O 例外/エラー 他の言語で書かれたプログラムとの相互作用 他のマシンとの相互作用(物理、仮想、または理論) この質問を始めたコメントに対して@JimmaHoffaに感謝します! パート2 多くの場合、マルチプロセッサプログラミングは最適化手法として使用され、コードの実行を高速化します。ロックと不変オブジェクトを使用する方が速いのはいつですか? アムダールの法則で定められた制限を考えると、不変オブジェクトと可変オブジェクトのロックで全体的なパフォーマンスを向上させることができます(ガベージコレクターの有無にかかわらず)。 概要 これら2つの質問を1つにまとめて、スレッド化の問題の解決策として不変性の境界ボックスがどこにあるのかを探ろうとしています。

3
参照の透明性とは何ですか?
命令型パラダイムでそれを見てきました f(x)+ f(x) 次と同じではない可能性があります。 2 * f(x) しかし、機能的なパラダイムでは同じでなければなりません。私はPythonとSchemeの両方のケースを実装しようとしましたが、私にとっては同じように見えます。 特定の関数との違いを指摘できる例は何でしょうか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.