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

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

3
F#とScalaの最大の違いは何ですか?
F#とScalaはどちらも関数型プログラミング言語であり、開発者が不変のデータ型のみを使用することを強制しません。どちらもオブジェクトをサポートしており、他の言語で記述されたライブラリを使用して、仮想マシンで実行できます。どちらの言語もMLに基づいているようです。 F#は.NETとJavaプラットフォーム用のScala向けに設計されているという事実にもかかわらず、F#とScalaの最大の違いは何ですか?

10
なぜプログラムはクロージャーを使用するのですか?
ここでクロージャーを説明する多くの投稿を読んだ後、私はまだ重要な概念がありません:なぜクロージャーを書くのですか? プログラマーが実行する特定のタスクのうち、クロージャーが最も役立つと思われるものは何ですか? Swiftでのクロージャーの例は、NSUrlのアクセスとリバースジオコーダーの使用です。以下にそのような例を示します。残念ながら、これらのコースは閉鎖を示しています。コードソリューションがクロージャとして記述されている理由は説明されていません。 私の脳を「あぁ、これのためにクロージャを書くべきだ」と言うかもしれない現実世界のプログラミング問題の例は、理論的な議論よりも有益でしょう。このサイトで利用可能な理論的議論の不足はありません。

3
ラムダとは何ですか、なぜ有用なのでしょうか?[閉まっている]
これまで私は聞いた: ラムダ計算 ラムダプログラミング ラムダ式 ラムダ関数 すべてが関数型プログラミングに関連しているようです... どうやらそれはC ++ 1xに統合されるので、今よりよく理解するかもしれません: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions 誰かがラムダのことを簡単に定義して、それがどこで役立つかを教えてもらえますか?

6
関数とラムダの違いは何ですか?
「関数」と「ラムダ」について少し混乱しています。スキームキーワードlambdaがJavaScriptキーワードfunctionと非常によく似ていることを示す例をいくつか見ましたが、それらがどのように関連しているかはわかりません。 .netでオブジェクトについて話す場合、「関数」と「メソッド」は同じ意味で使用できると言われています。「ラムダ」と「関数」が同じことを意味するのか疑問に思っています。ギリシャ文字のラムダ(λ)がこのサイトの非常に多くのアバターに登場しているのを見て、「ラムダ」には難解な意味があるのだろうか。物事をさらに混乱させるために、.netでは、C#の機能部分は別の関数に渡される関数式を「ラムダ式」と呼んでいます。 また、「ラムダ計算」という用語に漠然と精通しています。 関数とラムダの違いは何ですか?

12
どのプログラミング言語が最も見つけにくいバグを生成しますか?[閉まっている]
あなたの意見では、平均的なプログラマーが見つけにくいバグを最小限に抑えて機能を出力できる言語は何ですか?これはもちろん非常に広範な質問であり、私は非常に広く一般的な答えと知恵に興味があります。 個人的には、JavaおよびC#プログラムの奇妙なバグを探すのにほとんど時間を費やさず、C ++コードには明確な繰り返しバグのセットがあり、Python / similarにはコンパイラによって検出される一般的で愚かなバグのセットがあります他の言語で。 また、完全に機能的なコードで書かれた大きくて複雑なプログラムを見たことがないので、この点で関数型言語を検討するのは難しいと感じています。ご入力ください。 編集:見つけにくいバグを完全にarbitrary意的に明確化:再現するのに15分以上かかり、原因を見つけて修正するのに1時間以上かかります。 これが重複している場合はご容赦ください。ただし、この特定のトピックについては何も見つかりませんでした。

1
Haskellまたは他の関数型プログラミング言語でプログラムをどのように設計しますか?
私はc#やrubyなどのオブジェクト指向プログラミング言語の経験があります。オブジェクト指向スタイルでプログラムを設計する方法、クラスとオブジェクトを作成する方法、およびそれらの間の関係を定義する方法を知っています。いくつかのデザインパターンも知っています。 人々はどのように機能的なプログラムを書くのですか?どうやって始めますか?関数型言語の設計パターンはありますか?極端なプログラミングやアジャイル開発などの方法論は関数型言語に適用できますか?

3
コンビネーターとは何ですか?また、それらはプログラミングプロジェクトにどのように適用されますか?(実用的な説明)
コンビネーターとは何ですか? を探しています: 実用的な説明 それらの使用例 コンビネーターがコードの品質/汎用性を改善する方法の例 私は探していません: 作業の完了に役立たないコンビネータの説明(Yコンビネータなど)

14
なぜ関数型プログラミングに対する現在の熱意があるのですか?[閉まっている]
最近、Scala、Clojure、およびF#に関して、関数型プログラミング言語について多くの熱意を聞いています。私は最近、FPパラダイムを学ぶためにHaskellの勉強を始めました。 私はそれが大好きです、それは本当に楽しく、私の数学の背景に合います。 しかし、それは本当に重要でしょうか?明らかに、それは新しいアイデアではありません。 私の質問は次のとおりです。 最近のFP熱意に貢献したものは何ですか?オブジェクト指向に飽き飽きしているだけなのか、それともFPを以前よりも必要にするために何か変更されたのか これはFPの未来を示していますか?または、これはオブジェクト指向データベースのような流行ですか? 言い換えれば、誰が私がこれがどこから来てどこへ行くのかを理解するのを助けることができますか?

11
「推論するのは簡単」-それはどういう意味ですか?[閉まっている]
他の開発者がそのフレーズを使用して、いくつかのパターンを「宣伝」したり、ベストプラクティスを開発したりすることを何度も耳にしました。ほとんどの場合、このフレーズは、関数型プログラミングの利点について話しているときに使用されます。 「推論するのは簡単」というフレーズは、説明やコードサンプルなしでそのまま使用されています。だから私にとっては、次の「話題」の言葉のようになり、より「経験のある」開発者が講演で使用します。 質問:「推論するのは簡単ではない」例をいくつか挙げてください。「推論するのは簡単」の例と比較できますか?

6
Javaチェック例外の回避策
ラムダとデフォルトのメソッドインターフェースに関する新しいJava 8の機能に感謝します。それでも、私はまだチェックされた例外に飽きています。たとえば、オブジェクトのすべての表示フィールドを一覧表示するだけの場合は、単に次のように記述します。 Arrays.asList(p.getClass().getFields()).forEach( f -> System.out.println(f.get(p)) ); ただし、getメソッドはConsumerインターフェイスコントラクトに同意しないチェック例外をスローする可能性があるため、その例外をキャッチして次のコードを記述する必要があります。 Arrays.asList(p.getClass().getFields()).forEach( f -> { try { System.out.println(f.get(p)); } catch (IllegalArgumentException | IllegalAccessException ex) { throw new RuntimeException(ex); } } ); ただし、ほとんどの場合、例外をaとしてスローし、RuntimeExceptionコンパイルエラーなしで例外をプログラムに処理させるかどうかを許可します。 それで、私はチェックされた例外の迷惑のための私の物議を醸す回避策についてあなたの意見を持ちたいです。そのために、次のように補助インターフェイスConsumerCheckException<T>とユーティリティ関数rethrow(Dovalのコメントの推測に応じて更新)を作成しました。 @FunctionalInterface public interface ConsumerCheckException<T>{ void accept(T elem) throws Exception; } public class Wrappers { public static <T> Consumer<T> rethrow(ConsumerCheckException<T> c) …

6
関数型プログラミング言語の選択[終了]
私は最近、関数型プログラミング言語に関する多くのスレッドを読みました(実際、ほぼ1年で)。私は本当に一つを選んで徹底的に学びたいです。 最後の[コース]セメスター、私はSchemeを紹介されました。私はそれが好きだった。シンタックスの非常にシンプルさ、ホモイコニシティの原理、マクロ(衛生的および非衛生的)、手続きのn-アリティなどが大好きでした。 Schemeの問題はアカデミックな言語です。実稼働環境で実際に使用されるとは思わない。履歴書を持っていることが特に良いとは思いません。だから、私は代替手段を探していました。それらの多くがあり、それらはどういうわけかすべての人気の同様のレベルを持っているようです。 私がまだ検討した他のいくつかの関数型言語についての考え: Clojure:Javaの世界にアクセスできるため、素晴らしいサウンドに聞こえます。拡張性と同時実行性を指​​向していますが、Javaの世界は今、最先端にありませんか?私はすでにJavaをかなりよく知っていますが、JVMに依存してさらにエネルギーを追加するのが賢明でしょうか? Haskell:非常に高く評価されている言語のように見えますが、私が読んだことから、それはまたアカデミックな言語でもあります。 Lisp:それは永遠に続いています。私がSchemeから気に入っているもののほとんどを持っているようです。大きなコミュニティがあります。私が知っていることは、おそらく業界で最も広く使用されている関数型プログラミング言語でしょうか? F#:本当に考慮しなかった。私はMSのものの大ファンではありません。私は彼らのソフトウェアにお金を払う余裕がありません(大学の提携から自由にすることはできますが、私はコミュニティ主導のソリューションを使いたいと思っています)。とはいえ、それは最高のキャリア志向の選択だと思います。 今夜、私はLispに傾いています。1週間前、Haskellでした。それ以前はClojureでした。過去1年間、私はあなたが知っている理由のためにそれをプッシュするのではなく、楽しみのためにいくつかのスキームをしていました。今、私は真剣になりたい(1つを学ぶこと、それを使って実際のプロジェクトを行うこと、最終的には専門的に作業することについて)。私の問題は、いずれかを選択する前に、それらをすべて徹底的に学ぶ必要があることです。

2
アラン・ケイは、Smalltalkの初期の歴史における「割り当て」とはどういう意味ですか?
私はSmalltalkの初期の歴史を読んでおり、その意味の理解に疑問を抱かせる「割り当て」についての言及がいくつかあります。 OOPは多くの動機から来ましたが、2つが中心でした。大規模なものは詳細の隠蔽を伴う複雑なシステムのためのより良いモジュールスキームを見つけることであり、小規模なものは割り当てのより柔軟なバージョンを見つけることであり、それからそれを完全に排除しようとしました。 (1960-66から-初期のOOPおよび60年代のその他の形成的アイデア、セクションI) Simulaから得たのは、バインディングと割り当てを目標に置き換えることができるということです。プログラマーに最後に望むことは、たとえ比fig的に提示されたとしても、内部状態を混乱させることです。代わりに、オブジェクトは、動的コンポーネントとしての使用により適した、より高いレベルの動作のサイトとして提示される必要があります。(...)残念なことに、今日「オブジェクト指向プログラミング」と呼ばれるものの多くが、より洗練された構成要素を備えた単純な古いスタイルのプログラミングである。多くのプログラムには、より高価な添付プロシージャによって実行される「割り当てスタイル」操作がロードされています。 (「オブジェクト指向」スタイル、セクションIVから) オブジェクトがファサードであり、オブジェクトにインスタンス変数を設定することを目的とするメソッド(または「メッセージ」)(つまり「割り当て」)が目的に反しているという意図を解釈するのは正しいですか?この解釈は、セクションIVの後半の2つのステートメントでサポートされているようです。 永続状態、ポリモーフィズム、インスタンス化、およびオブジェクトの目標としてのメソッドの4つの手法が一緒に使用され、多くの権限を占めています。これらのいずれも「オブジェクト指向言語」を採用する必要はありません--ALGOL 68はほとんどこのスタイルに変えることができます-そして、OOPLは単に特定の実りある方向にデザイナーの心を集中させます。ただし、カプセル化を正しく行うことは、状態の抽象化だけでなく、プログラミングから状態指向のメタファーを排除することを約束するものです。 ...そして: 割り当てステートメントは、抽象的なものであっても、非常に低いレベルの目標を表します。何かを成し遂げるためには、それらの多くが必要になります。一般に、シミュレートされているかどうかに関係なく、プログラマが状態をいじり回すことは望ましくありません。 ここでは、不透明で不変のインスタンスが推奨されていると言ってもいいでしょうか?または、推奨されていない単純な状態変更ですか?私が持っている場合たとえば、BankAccountクラスを、それが持ってOKだGetBalance、DepositとWithdrawインスタンスメソッド/メッセージ。SetBalanceインスタンスメソッド/メッセージがないことを確認してください?

3
C#/ OOPでは貧弱なドメインモデルが悪いと考えられますが、F#/ FPでは非常に重要なのはなぜですか?
でブログの記事楽しさと利益のためにF#上、それは言います: 機能設計では、動作をデータから分離することが非常に重要です。データ型は単純で「ダム」です。そして、別に、これらのデータ型に作用する多くの関数があります。 これは、動作とデータを組み合わせることを意図したオブジェクト指向設計の正反対です。結局のところ、それはまさにクラスです。実際にオブジェクト指向の設計では、振る舞い以外は何もありません。データはプライベートであり、メソッドを介してのみアクセスできます。 実際、OODでは、データ型の周囲に十分な動作がないことは悪いことと見なされ、「貧血領域モデル」という名前さえあります。 C#では、F#から借用し続け、より機能的なスタイルのコードを記述しようとしているようです。なぜデータ/動作を分離するという考えを借りず、それを悪いと考えるのでしょうか?定義がOOPを伴わないというだけなのでしょうか、それともC#で悪いのに何らかの理由でF#に適用されない(そして実際には逆になる)具体的な理由がありますか? (注:私は、ブログ投稿のどちらかの意見に同意しない個人ではなく、善/悪の意見を変える可能性のあるC#/ F#の違いに特に興味があります)。

5
IOモナドが世界で動作する状態モナドと見なされているという批判
IOHaskellではモナドは、多くの場合、状態は世界でStateモナドとして説明します。したがって、IO aモナド型の値はのようなものと見なされますworldState -> (a, worldState)。 しばらく前に、私はこの見解を批判し、それが正しくない理由をいくつか示した記事(またはブログ/メーリングリストの投稿)を読みました。しかし、記事も理由も思い出せません。誰もが知っていますか? 編集:記事は失われたようですので、ここからさまざまな議論を集めましょう。 私は物事をより面白くするための賞金を始めています。 編集:私が探していた記事は、厄介な部隊への取り組みです:サイモンペイトンジョーンズによるHaskellでのモナド入力/出力、同時実行、例外、および外国語呼び出し。(TacTicsの回答に感謝します。)


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