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

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

7
最も純粋な関数型プログラミング言語ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 関数型プログラミングの学習に興味があります。そのためには、可能な限り純粋な関数型プログラミング言語を使用するように強制する必要があることは明らかです。それゆえ、私は多かれ少なかれ、関数型プログラミング言語の純度に応じた順序付けを求めています。 LispやClojure(またはScheme、Scalaなど)を学ぶ方が実際的だと思われますが、最近聞いたところでは、Haskellは関数型プログラミングの原理を誰かに教えるのに非常に難しいでしょう。私はまだこれについて確信がありませんので、私はあなたに尋ねています:最も純粋な関数型プログラミング言語はどれですか?最も純粋な関数型プログラミング言語の壮大なタイトルを求めて競合する人がいたら、注文は素晴らしいことです。

4
なぜすべての関数型プログラミングのチュートリアルがこんなに充実しているのですか?
私は関数型プログラミングを学ぼうとしており、私が見つけたほとんどのチュートリアルでは、より複雑な構造の例として数学を使用しています(場合によっては単純な構造も)。どうしてこれなの?もっと簡単なものが使用できると思います。そのため、学習が難しくなっています。 背景情報:私は12年間ソフトウェアを書いています。クロージャ、ファーストクラスの市民としての機能、ジェネリックなどの概念の一部を理解しています。高度なレベルで高階関数に問題があるかもしれませんが、基本的な理解があると思います。モナドは私を尻に噛みついており、この時点で私はそれを過ぎていない(私はしつこいので、最終的にはそうなると確信している)。

1
一意性タイプを使用して安全な並列処理を実装する
しばらくの間、純粋な関数型言語のモナドの代替として、一意性タイプに興味がありました。残念ながら、これは一種のCS研究の難解な分野であり、ユニークなタイプのプログラミングに関するオンラインリソースはほとんどありません。 参照(「ボックス」)や配列などのステートフルデータ構造を実装するために一意性タイプがどのように使用されるかは明らかですが、他の一般的なステートフルデータ構造を実装する方法を回避します。 たとえば、一意の型によるロックを実装することは可能ですか?一意性タイプを使用して、スレッド間で可変デー​​タを共有できますか?一意の型を使用して同期プリミティブ(ミューテックスなど)を構築することは可能ですか、またはメッセージの受け渡しは必要ですか?

2
Lispマクロの典型的な用途は何ですか?
私はいくつかのLISPを学ぼうとしていますが、LISPマクロの重要性について多くのことを読みましたので、それらを使った実務経験を得たいと思います。 マクロを使用して実際の問題を解決し、このプログラミング構成の有用性を理解できる実用的なアプリケーション領域を提案できますか? 注意 これは一般的なプロジェクトではなく、次の質問を行うべきプロジェクトです。LISPマクロを使用して通常どのような問題が解決されるかを理解したいと思っています。たとえば、抽象データ型の実装に適していますか?なぜこのコンストラクトが言語に追加されたのですか?単純な機能では解決できない、どのような問題を解決しますか?

6
関数型プログラミングを使用して、完全なエンタープライズアプリケーションを開発できますか?
関数型プログラミング(FP)を学び始めたばかりです。私はすべてがオブジェクトであり、それらのほとんどが可変であるOOPの世界から来ています。関数には副作用がないという概念をまとめるのに苦労しています。 何かが可変ではない場合、従業員や個人などの一般的なオブジェクトはFPでどのように表されますか。 FPを使用して本格的なエンタープライズアプリケーションを作成できますか?

3
ソフトウェアの品質に対する異なる言語の影響に関する経験的な研究はありますか?
関数型プログラミング言語の支持者は、関数型プログラミングによってコードについて推論するのが容易になると断言しています。静的に型付けされた言語を好む人は、コンパイラが型システムの複雑さを補うのに十分なエラーをキャッチすると言います。しかし、これらのトピックで読んだものはすべて、経験的データではなく、合理的な議論に基づいています。 プログラミング言語のさまざまなカテゴリが欠陥率またはその他の品質指標にどのような影響を与えるかについて、実証的な研究はありますか? (この質問に対する答えは、少なくとも動的と静的の議論については、そのような研究はないことを示しているようです)

7
良い最初の関数型プログラミングプロジェクトは何でしょうか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 8年前に閉鎖されました。 良い最初の関数型プログラミングプロジェクトは何でしょうか? 私は独身のプロジェクトを成功させたいと思っており、機能的なプログラミングプロジェクトを終えたいと思っています。私たちは学校で勉強しませんでしたが、新しいことを自分で学ぼうとすることをお勧めします。 。 問題は、夏休みを利用して関数型プログラミングの理解を深め、1つの言語に精通するために、プロジェクトを少し早めに開始したいということです。 少しやりがいのある優れた実践プロジェクトですが、言語やパラダイムなどを学ぶこともできます。そして、私の学士プロジェクトにとって良いプロジェクト(より高度なプロジェクト)になると思いますか? 関数型プログラミングを始めるときに最初から最適な言語を提案することも歓迎します。

4
プログラマーへの参照透過性の利点は何ですか?
プログラミングにおいて、参照の透明性の利点は何ですか? RTは、機能的パラダイムと命令型パラダイムの大きな違いの1つであり、機能的パラダイムの支持者が命令型パラダイムに対する明確な利点としてよく使用します。しかし、彼らの努力のすべてにおいて、これらの支持者は、それがプログラマーとしての私にとってなぜ利益であるかを決して説明しません。 確かに、彼らはそれがどのように「純粋」で「エレガント」であるかについて学問的な説明をしますが、それほど「純粋でない」コードよりもそれをどのように改善しますか?毎日のプログラミングでどのようなメリットがありますか? 注: これは、参照透過性とは何ですか? 後者はRTとは何かというトピックに対処しますが、この質問はその利点を扱います(それほど直感的ではないかもしれません)。

3
代数データ型はどのような問題を解決しますか?
公正な警告、私は関数型プログラミングは初めてなので、多くの悪い仮定を抱くかもしれません。 私は代数型について学んでいます。多くの関数型言語にはそれらが含まれているようで、パターンマッチングと併用するとかなり便利です。ただし、実際にどのような問題を解決しますか?次のように、C#で一見(一種の)代数型を実装できます。 public abstract class Option { } public class None : Option { } public class Some<T> : Option { public T Value { get; set; } } var result = GetSomeValue(); if(result is None) { } else { } しかし、これはオブジェクト指向プログラミングのろくでなしであることにほとんどの人が同意すると思うので、絶対にやるべきではありません。それで、関数型プログラミングは、このスタイルのプログラミングをあまり目立たないようにする、より簡潔な構文を追加するだけですか?他に何が欠けていますか?

6
関数型プログラミングは、問題と解決策の間の「代表的なギャップ」を増やしますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 機械言語(例:)は、0110101000110101一般にコンピューター言語がより高度な抽象化に進化してきたため、一般的に問題に適用されたときにコードを理解しやすくします。アセンブラーはマシンコードの抽象化であり、Cはアセンブラーの抽象化などでした。 オブジェクト指向設計は、オブジェクトの観点から問題をモデル化するのに非常に優れているようです。たとえば、大学の履修登録システムの問題は、Courseクラス、Studentクラスなどでモデル化できます。 OO言語では、責任を負う同様のクラスがあり、一般に設計、特にコードのモジュール化に役立ちます。この問題をOOメソッドで解決する10の独立したチームに与えた場合、通常、10のソリューションには共通して問題に関連するクラスがあります。これらのクラスの結合と相互作用を開始し始めると、多くの違いが生じる可能性があるため、「表現のギャップがゼロ」というものはありません。 関数型プログラミングの私の経験は非常に限られています(実際の使用はなく、Hello Worldタイプのプログラムのみ)。このような言語がOO言語のようにFPソリューションを問題に(低い表現のギャップで)簡単にマッピングできるようにする方法を私は見ていません。 並行プログラミングに関するFPの利点を理解しています。しかし、私は何かを逃していますか、またはFPは表現のギャップを減らすことではありませんか? これを尋ねる別の方法:同じ現実の問題を解決する10の異なるチームのFPコードには多くの共通点がありますか? 抽象化に関するウィキペディア(コンピューターサイエンス)から(強調鉱山): 関数型プログラミング言語は一般に、ラムダ抽象化(用語を変数の関数にする)、高次関数(パラメーターは関数)、ブラケット抽象化(用語を変数の関数にする)など、関数に関連する抽象化を示します。 [一部の]実際の問題はこのような抽象化では簡単にモデル化されないため、表現のギャップは潜在的に拡大する可能性があります。 表現のギャップを減らすもう1つの方法は、ソリューション要素を問題にまでさかのぼることです。0さんと1マシンコードでSは一方で、バックトレースすることは非常に困難であるStudentクラスは、トレースバックに簡単です。すべてのOOクラスが問題空間に簡単にトレースできるわけではありませんが、多くのクラスがトレースしています。 FPの抽象化は、常に彼らが(離れてから解決されている問題空間のどの部分を見つけるために説明する必要はありません数学の問題)?OK-私はこの部分でいいです。さらに多くの例を見ると、FPの抽象化がデータ処理で表現される問題の一部に対して非常に明確であることがわかります。 関連する質問に対する受け入れられた回答UMLは、機能プログラムのモデル化に使用できますか?-「機能プログラマーは、ダイアグラムをあまり使いません」と言います。それがUMLであるかどうかは本当に気にしませんが、広く使用されているダイアグラムがない場合、FPの抽象化が簡単に理解/通信できるかどうか疑問に思います(この答えが正しいと仮定して)。繰り返しになりますが、FPの使用/理解のレベルはささいなものなので、単純なFPプログラムのダイアグラムの必要はないと理解しています。 OOデザインには、機能/クラス/パッケージレベルの抽象化があり、それぞれにカプセル化(アクセス制御、情報隠蔽)があり、複雑さの管理を容易にします。これらは、問題から解決策へと簡単に戻ることができる要素です。 多くの答えは、オブジェクト指向に類似した方法でFPで分析と設計が行われる方法について述べていますが、これまで高レベルのものを引用する人はいません(paulはいくつかの興味深いものを引用しましたが、低レベルです)。昨日はグーグルで多くのことをして、興味深い議論を見つけました。以下は、サイモン・トンプソンによるリファクタリング機能プログラムからのものです(2004)(強調の鉱山) オブジェクト指向システムの設計では、プログラミングよりも設計が優先されることは当然のことです。デザインは、EclipseなどのツールでサポートされているUMLのようなシステムを使用して作成されます。初心者のプログラマーは、BlueJのようなシステムを使用して視覚的な設計アプローチを学ぶことができます。関数型プログラミングのための同様の方法論に関する作業がFAD:Functional Analysis and Designで報告されていますが、他の作業はほとんどありません。これにはいくつかの理由があります。 既存の機能プログラムは、設計を必要としない規模です。多くの機能プログラムは小さいですが、Glasgow Haskell Compilerなどの他のプログラムはかなりのものです。 機能プログラムはアプリケーションドメインを直接モデル化するため、デザインは無関係になります。関数型言語はさまざまな強力な抽象化を提供しますが、これらが現実世界をモデル化するために必要なすべての抽象化のみを提供すると主張することは困難です。 機能プログラムは、進化する一連のプロトタイプとして構築されます。 上記で引用された博士論文では、分析と設計の方法論(ADM)を使用する利点が、パラダイムとは無関係に概説されています。しかし、ADMは実装パラダイムと整合する必要があるという主張がなされています。つまり、OOADMはOOプログラミングに最適であり、FPなどの別のパラダイムにはあまり適用されません。これは、私が表現ギャップと呼ぶものを言い換えていると思う素晴らしい引用です: どのパラダイムがソフトウェア開発に最適なサポートを提供するかについては長々と議論できますが、問題の説明から実装および配信まで単一のパラダイム内にとどまると、最も自然で効率的かつ効果的な開発パッケージを実現できます。 FADが提案する一連の図を次に示します。 実装で使用する関数を関数に提示する関数依存図。 型に同じサービスを提供する型依存図。そして、 システムのモジュールアーキテクチャのビューを表示するモジュール依存関係図。 FAD論文のセクション5.1にはケーススタディがあります。これは、フットボール(サッカー)リーグに関連するデータの生成を自動化するシステムです。要件は100%機能的です。たとえば、サッカーの結果の入力、リーグテーブルの作成、得点表、出欠表、チーム間での選手の移動、新しい結果の後のデータの更新などです。 、「新しい機能は最小限のコストで許可する必要がある」と述べることは別として、テストすることはほぼ不可能です。 悲しいことに、FADを除いて、FP用に提案されているモデリング言語(視覚)の最新の参照はありません。UMLは別のパラダイムなので、それを忘れてください。

4
関数型プログラミングの状態問題に対処する
私は主にOOPの観点からプログラミングの方法を学びました(私たちのほとんどがそうであるように)が、機能的な方法で問題を解決する方法を学ぶために多くの時間を費やしました。FPで計算上の問題を解決する方法はよく理解していますが、より複雑な問題になると、常に可変オブジェクトが必要になります。たとえば、パーティクルシミュレータを作成している場合、変更可能な位置を持つパーティクル「オブジェクト」を更新する必要があります。本質的に「ステートフル」な問題は、通常、関数型プログラミング手法を使用してどのように解決されますか?

1
Scala関数をJava 8メソッドに渡す
次のScalaコードは機能し、関数を必要とするJavaメソッドに渡すことができます。これを行うよりクリーンな方法はありますか?これが私の最初のパスです。 val plusOne = new java.util.function.Function[Int,Int] { override def apply(t:Int):Int = t + 1 override def andThen[V](after:function.Function[_ >: Int, _ <: V]): function.Function[Int, V] = ??? override def compose[V](before:function.Function[_ >: V, _ <: Int]): function.Function[V, Int] = ??? } 2番目のパスは次のとおりです。Java-8Functionインターフェイスの汎用ラッパーを使用して、Scalaの構文を簡素化します。 // Note: Function1 is Scala's functional interface, // Function (without …

4
永続性は純粋に機能的な言語にどのように適合しますか?
コマンドハンドラーを使用して永続性を処理するパターンは、IO関連のコードをできるだけ薄くしたい純粋に機能的な言語にどのように適合しますか? オブジェクト指向言語でドメイン駆動設計を実装する場合、コマンド/ハンドラーパターンを使用して状態の変更を実行するのが一般的です。この設計では、コマンドハンドラーはドメインオブジェクトの上に配置され、リポジトリの使用やドメインイベントの発行など、永続性に関連する退屈なロジックを担当します。ハンドラーは、ドメインモデルのパブリックフェイスです。UIなどのアプリケーションコードは、ドメインオブジェクトの状態を変更する必要があるときにハンドラーを呼び出します。 C#のスケッチ: public class DiscardDraftDocumentCommandHandler : CommandHandler<DiscardDraftDocument> { IDraftDocumentRepository _repo; IEventPublisher _publisher; public DiscardDraftCommandHandler(IDraftDocumentRepository repo, IEventPublisher publisher) { _repo = repo; _publisher = publisher; } public override void Handle(DiscardDraftDocument command) { var document = _repo.Get(command.DocumentId); document.Discard(command.UserId); _publisher.Publish(document.NewEvents); } } documentドメインオブジェクトは、((「あなたは既に破棄されていた文書を破棄することはできません」または「ユーザーが文書を破棄する権限を持つべきである」のような)ビジネスルールを実装するため、我々は公開する必要があるドメインイベントを発生させるための責任があるdocument.NewEventsだろうIEnumerable<Event>おそらく含まれていますDocumentDiscarded)イベントを。 これは素晴らしいデザインです-拡張が簡単で(ドメインモデルを変更せずに新しいコマンドハンドラーを追加することで新しいユースケースを追加できます)、オブジェクトの永続化方法に依存しません(MongoのNHibernateリポジトリを簡単に交換できます)リポジトリ、またはRabbitMQパブリッシャーをEventStoreパブリッシャーに交換します)これにより、偽物やモックを使用して簡単にテストできます。また、モデル/ビューの分離に従います-コマンドハンドラーは、バッチジョブ、GUI、またはREST APIのいずれで使用されているかわかりません。 Haskellのような純粋に機能的な言語では、おおよそ次のようにコマンドハンドラーをモデル化できます。 newtype CommandHandler = CommandHandler {handleCommand :: …

5
多くのJVM言語をサポートするために、JVMが非常に多用途なのはなぜですか?
以下のようなJava以外の多くの言語ので、JVMがサポートGroovy,Clojure,ScalaするJavaとは異なり、関数型言語ですなど(私が言及していますバージョン8以前のJavaLambda'sそれほど多彩な機能capabilities.OnにJVMを作るもの高いレベルをサポートしていませんサポートされていません)オブジェクト指向言語と関数型言語の両方をサポートできますか?

3
最も速い関数型言語
私は最近、特にHaskellとF#の関数型プログラミングを掘り下げてきました。いくつかのグーグルを回った後、より顕著な関数型言語(Scala、F#など)のベンチマーク比較を見つけることができませんでした。 一部の言語はハイブリッドであるため、必ずしも公平ではないことを知っています(Scalaが思い浮かびます)が、どの操作と全体でどのパフォーマンスが優れているかを知りたいだけです。

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