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

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

6
なぜ関数型プログラミングなのか
関数型プログラミングとは何ですか?私はそれについて多くのことを話しますが、正直なところ、私はそれらがまったく有用だとは思いませんでした。なぜこれほど多くの大学が彼らに教えているのでしょうか?

9
F#を大規模なコードベースとエンジニアリングチームに導入する際の現実的な落とし穴[非公開]
私は、大規模な既存のコードベース(すべてC#)と大規模なエンジニアリングチームを持つソフトウェア会社のCTOです。コードの特定の部分をF#で書くのがはるかに簡単になり、開発時間の短縮、バグの減少、並列実装の容易化など、基本的に私のチームの全体的な生産性の向上が見られます。ただし、F#を導入する生産性の落とし穴もいくつかあります。 1)誰もがF#を習得する必要があり、たとえばJavaからC#に切り替えるほど簡単ではありません。F#を学習していないチームメンバーは、コードベースのF#の部分で作業することはできません。 2)現在(2010年12月)の雇用可能なF#プログラマーのプールは存在しません。さまざまなソフトウェアエンジニアの履歴書データベースで「F#」を検索します。履歴書の1%未満がキーワードを含んでいます。 3)現在(2010年12月)のコミュニティサポートはあまり利用できません。C#のほとんどすべての問題をグーグルで検索し、F#でではなく、すでにそれを処理した人を見つけることができます。サードパーティのツールサポート(NUnit、Resharperなど)も大ざっぱです。 私はこれが少しCatch-22であることに気づきました。つまり、私のような人々がF#を使用しない場合、コミュニティとツールは決して実現しません、など。しかし、私は会社を経営しています。最先端ではありません。 私が検討していない他の落とし穴はありますか?または、私が言及した落とし穴に反論したい人はいますか?これは重要な議論であり、このパブリックフォーラムでの反論を聞いてみたいと思います。反論は、業界によるF#の採用を増やすのに大いに役立つかもしれません。

7
命令的なbreakステートメントと他のループチェックの機能的に同等なものは何ですか?
私が以下のロジックを持っているとしましょう。関数型プログラミングでそれを書く方法は? public int doSomeCalc(int[] array) { int answer = 0; if(array!=null) { for(int e: array) { answer += e; if(answer == 10) break; if(answer == 150) answer += 100; } } return answer; } ほとんどのブログ、記事の例では、単純な数学関数「Sum」の単純な例を説明しています。しかし、私は上記のようなJavaで書かれたロジックを持っているので、それをClojureの機能コードに移行したいと思っています。FPで上記を実行できない場合、FPのプロモーションの種類はこれを明示しません。 上記のコードは完全に必須であることを知っています。将来的にFPに移行するという先入観に基づいて書かれたものではありません。

2
Haskell委員会がI / Oを表すモナドを選んだのはなぜですか?
クリーン言語が使用一意の種類を純粋に機能的な設定でI / Oを処理します。Haskell委員会がなぜモナドを使用したのですか?委員会が調査したが、反対した決定した状態を処理するための他の提案がありましたか? 注:私は、モナドと他の形式のコンピューティングとの間の聖戦を探していません。I / Oに関する委員会の選択だけにトピックを保ちましょう。

12
関数型プログラミング入門のスキームvs Haskell?
私はCおよびC#でのプログラミングに満足しており、将来C ++を検討します。関数型プログラミングを別のプログラミングパラダイムとして検討することに興味があるかもしれません。私はこれを楽しみのためにやっています。私の仕事はコンピュータープログラミングに関係しておらず、大学のコンピューターサイエンスコースでかなり早い時期に教えられた関数型プログラミングの使用にやや影響を受けています。ラムダ計算は確かに私の数学的な能力を超えていますが、関数型プログラミングを処理できると思います。 HaskellとSchemeのどちらが関数型プログラミングの入門として役立つでしょうか?私はemacsをテキストエディタとして使用しますが、Emacs Lispの学習を必要とする将来、より簡単に設定できるようにしたいと考えています。しかし、私の理解では、Emacs LispはSchemeとはかなり異なり、機能的というよりも手続き的です。 Schemeを追求すれば、すでに購入した「The Little Schemer」の本を使用している可能性があります(限定的なリーフィングから少し奇妙に思えます)。または、私がHaskellを追求する場合、「Learn Good a Haskell for Great Good」を使用します。また、チャンネル9でErik Meijer博士によるHaskellの紹介ビデオも見ました。 提案、フィードバック、または入力を歓迎します。 ありがとう。 PS BTW C#開発に使用しているVisual Studio 2010があるため、F#にもアクセスできますが、言語を選択するための主要な基準とは思われません。


2
「作曲しない」の意味は何ですか?
多くのテキスト、特に関数型プログラミングテキストは、特定のCSの概念が「構成しない」と主張しています。例は次のとおりです。ロックは作成されません、モナドは作成されません。 私はこのフレーズの意味を正確に追跡するのに苦労してきました。構成について考えるとき、関数構成またはオブジェクト集約のいずれか(「継承よりも優先する構成」など)を考えますが、それはここで人々が使用している意味ではないようです。 上記の2つの例(つまり、ロックとモナド)のような式で使用される場合、誰かがこのフレーズの意味を説明できますか?

6
一部の関数型プログラミング言語は、関数の適用にスペースを使用するのはなぜですか?
関数型プログラミングのためにいくつかの言語を見てきましたが、なぜ一部のfp言語は関数アプリケーション(および定義)に1つ以上の空白文字を使用するのかと疑問に思いましたが、ほとんどの(すべて?)命令型/オブジェクト指向言語は括弧を使用していますより数学的な方法である。また、後者のスタイルは、括弧がない場合よりもはるかに明確で読みやすいと思います。 したがって、関数f(x)=x²がある場合、それを呼び出すための2つの選択肢があります。 FP: f x 例: ML、Ocaml、F# ハスケル LISP、Scheme(なんとか) 非FP: f(x) 例: ほぼすべての命令型言語(私は知っている、コメント/回答を見る) アーラン Scala(単一の引数に「演算子表記」も許可) 括弧を「除外」する理由は何ですか?


5
Javascriptは関数型プログラミング言語ですか
Javascriptは関数型言語ですか?私はそれがオブジェクトを持っていることを知っています&あなたもそれでOOPを行うことができますが、それは関数型言語でもあります、そのように使用できますか? OOPがどのようにプログラミングの次の進化のようになったか/知っている、それは「機能プログラミング」が次の進化であることを意味します(注:これは意見のプロンプトではなく、事実に基づいた答えのプロンプトであり、このノートは投稿者よりもモデレーターの方が多い;))。 私は例を通して最もよく学びます。おそらく、誰かが同じタスクをOOPの方法で実行し、それから関数型プログラミングの方法で関数型プログラミングの機能を理解して比較することができます。 「関数型プログラミング」を正直に完全に理解していない:Pしたがって、Javascriptと関数型プログラミングを比較することは完全に間違っている可能性があります。 関数型プログラミングを素人の言葉で言うと、それは単に匿名関数を使用したアブスレーションの利点ですか? または、その方法は単純すぎますか?簡単に言うと、OOPはオブジェクトを介した抽象化の利点ですが、OOPを説明するには少し単純すぎると思います。 これは関数型プログラミングの良い例ですか?... Javascript OOPの例: // sum some numbers function Number( v ) { this.val = v; } Number.prototype.add( /*Number*/ n2 ) { this.val += n2.val; } 関数型プログラミングの例: function forEach(array, action) { for (var i = 0; i < array.length; i++) action(array[i]); } function add(array) { …

7
Haskellの型システムは、関数型プログラミングを理解する上での障害ですか?[閉まっている]
私は関数型プログラミングを理解する目的でHaskellを勉強していますが、他の言語(Groovy、Python、JavaScriptを中心に)で得た洞察を適用することを期待しています。 Haskellを選んだのは、非常に純粋に機能的であり、状態への依存を許さないという印象を持っていたからです。 私は非常に厳格な型システムをナビゲートすることに興味があったので、Haskellを学ぶことを選択しませんでした。 私の質問はこれです:強い型システムは非常に純粋な関数型言語の必要な副産物ですか、またはこれはHaskellに特有の無関係な設計選択ですか?

6
クロージャーは不純な機能スタイルと見なされますか?
関数型プログラミングではクロージャは不純であると考えられますか? 関数に値を直接渡すことで、一般にクロージャを回避できるようです。したがって、可能な限り閉鎖を避けるべきですか? それらが不純であり、避けることができると述べるのが正しい場合、なぜ多くの関数型プログラミング言語がクロージャーをサポートするのですか? 純粋な関数の基準の1つは、「関数は常に同じ引数値を指定すると同じ結果値を評価する」ということです。 仮に f: x -> x + y f(3)常に同じ結果が得られるとは限りません。f(3)のy引数に依存しない値に依存しますf。したがってf、純粋な関数ではありません。 すべてのクロージャーは引数ではない値に依存しているため、クロージャーがどのように純粋になる可能性がありますか?はい、理論的には、閉じた値は一定である可能性がありますが、関数自体のソースコードを見ただけではそれを知る方法はありません。 これが私を導くのは、同じ機能はある状況では純粋であるが、別の状況では不純かもしれないということです。ソースコードを調べても、関数が純粋であるかどうかを常に判断できるわけではありません。むしろ、そのような区別をする前に呼び出される時点で、その環境のコンテキストでそれを考慮する必要があります。 私はこれについて正しく考えていますか?

1
最新のCPUでの単一割り当てADT指向コードのパフォーマンス
単一の割り当てで不変データを操作すると、より多くのメモリが必要になるという明らかな効果があります。これは、常に新しい値を作成しているためです(ただし、隠れたコンパイラーはポインタートリックを実行して問題を軽減します)。 しかし、CPU(具体的にはそのメモリコントローラー)がメモリが(それほど)変化していないという事実を利用できるという点で、パフォーマンスの低下よりもパフォーマンスの低下を上回ることを何度か耳にしました。 私は誰かがこれが本当であるかどうか(またはそうでない場合)に光を当てることを望んでいました。 で別のポストにコメントそれがいることを言及した抽象データ型(ADTのは)私は、さらに好奇心作られたこれに関係しています、どのようにADTは、具体的にメモリとCPUの取引方法に影響しますか?ただし、これは別ですが、ほとんどの場合、言語の純度がCPUおよびそのキャッシュなどのパフォーマンスに必ず影響することに興味があります。


7
クラスを使用したOOPと比較した関数型プログラミング
私は最近、関数型プログラミングの概念のいくつかに興味を持っています。しばらくの間、OOPを使用しました。OOPでかなり複雑なアプリを作成する方法を見ることができます。各オブジェクトは、そのオブジェクトが行うことを行う方法を知っています。または、親クラスでも同様です。だから私は単にPerson().speak()人に話させるように言うことができます。 しかし、関数型プログラミングで同様のことを行うにはどうすればよいですか?関数がどのようにファーストクラスのアイテムであるかがわかります。しかし、その機能は特定の1つのことだけを行います。私は単にsay()周りに浮かぶメソッドを持ち、それを同等のPerson()引数で呼び出すので、何か言っていることを知っていますか? だから私は簡単なことを見ることができます、機能プログラミングでOOPとオブジェクトの比較をどのように行うのですか?それで、コードベースをモジュール化して整理できますか? 参考までに、OOPでの私の主な経験は、Python、PHP、およびいくつかのC#です。私が見ている機能的な機能を持つ言語は、ScalaとHaskellです。私はScalaに傾いていますが。 基本的な例(Python): Animal(object): def say(self, what): print(what) Dog(Animal): def say(self, what): super().say('dog barks: {0}'.format(what)) Cat(Animal): def say(self, what): super().say('cat meows: {0}'.format(what)) dog = Dog() cat = Cat() dog.say('ruff') cat.say('purr')

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