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

関数型プログラミングは、関数を使用して抽象化を構築し、副作用や状態の変化を回避することに基づくプログラミングパラダイムです。純粋な関数型プログラミングはスレッドセーフです。

9
関数型プログラミングの利点は何ですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。私たちは回答が事実、参考文献、または専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張された議論を誘います。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 8年前に閉鎖。 関数型プログラミングの利点は何だと思いますか?そして、彼らは今日のプログラマーにどのように適用しますか? 関数型プログラミングとOOPの最大の違いは何ですか?

1
働く男性のためのコンビネーターの説明
コンビネーターとは何ですか? それは(SOで定義されている)「自由変数のない関数または定義」ですか? または、これについてはどうでしょうか。JohnHughesによる、Arrowsに関する彼の有名な論文によると、「コンビネータはプログラムフラグメントからプログラムフラグメントを構築する関数です」。これは、「...手ですべての詳細を書き込むのではなく、自動的にプログラムします。」彼はさらに続けて、そのようなコンビネーターの2つの一般的な例であるmapと言いfilterます。 最初の定義に一致するいくつかのコンビネーター: S K Y To Mock a Mockingbirdの他の人(私は間違っているかもしれません-私はこの本を読んだことがありません) 2番目の定義に一致するいくつかのコンビネーター: 地図 フィルタ フォールド/リデュース(おそらく) >> =、作成、fmapのいずれか????? 私は最初の定義には興味がありません-それらは私が実際のプログラムを書くのを助けにはしません(あなたが私に間違っていると納得させれば+1)。 2番目の定義を理解してください。map、filter、reduceは便利だと思います。これらを使用すると、より高いレベルでプログラムを作成できます。ミスが少なく、コードが短くて明確になります。コンビネーターに関する私の特定の質問のいくつかはここにあります: マップ、フィルターなどのコンビネーターの他の例は何ですか? プログラミング言語はどのコンビネーターによく実装されていますか? コンビネーターは、より良いAPIを設計するのにどのように役立ちますか? 効果的なコンビネーターを設計するにはどうすればよいですか? 非関数型言語(Javaなど)と似ているコンビネーターとは何ですか、またはこれらの言語はコンビネーターの代わりに何を使用していますか? 更新 @CA McCannのおかげで、コンビネータについて多少理解が深まりました。しかし、1つの質問はまだ私にとって問題です。 コンビネーターを多用して書かれた関数型プログラムと書かれていない関数型プログラムの違いは何ですか? 答えは、combinator-heavyバージョンのほうが短く、明確で、より一般的だと思いますが、可能であれば、より詳細な議論をお願いします。 またfold、一般的なプログラミング言語での複雑なコンビネーターの例や説明(つまり、より複雑)も探しています。

3
カレーを利用するためのパラメータの順序付け
私は二回、最近のようなハックあまりにも多くのコードがあったので、パラメータの順序を変更するために、コードをリファクタリングしているflipかが\x -> foo bar x 42起こったが。 関数シグネチャを設計するとき、カレーを最大限に活用するのに役立つ原則は何ですか?

4
別の関数を返す関数を作成するにはどうすればよいですか?
Pythonで、make_cylinder_volume(r)別の関数を返す関数を書きたいのですが。返される関数は、パラメータを使用して呼び出すことができh、高さhと半径を持つ円柱の体積を返す必要がありますr。 Pythonの関数から値を返す方法を知っていますが、別の関数を返すにはどうすればよいですか?

9
関数型プログラミング言語はどのように機能しますか?
関数型プログラミング言語が状態を保存できない場合、ユーザーからの入力を読み取るなどの単純なことをどのように実行しますか?入力をどのように「保存」するか(または、そのためのデータを保存するか)。 たとえば、この単純なCの事柄は、Haskellのような関数型プログラミング言語にどのように変換されますか? #include<stdio.h> int main() { int no; scanf("%d",&no); return 0; } (私の質問は、この優れた投稿「名詞の王国での実行」に触発されました。これを読むと、オブジェクト指向プログラミングとは何か、Javaが1つの極端な方法でそれを実装する方法、および関数型プログラミング言語がどのように機能するかについて理解が深まりましたコントラスト。)

10
Scalaで3つ以上のリストを一緒に圧縮できますか?
次のScalaリストがあるとします。 val l = List(List("a1", "b1", "c1"), List("a2", "b2", "c2"), List("a3", "b3", "c3")) どうすれば入手することができますか: List(("a1", "a2", "a3"), ("b1", "b2", "b3"), ("c1", "c2", "c3")) zipは2つのリストを組み合わせるためにのみ使用できるので、メインリストを何とか反復/削減する必要があると思います。当然のことながら、以下は機能しません。 scala> l reduceLeft ((a, b) => a zip b) <console>:6: error: type mismatch; found : List[(String, String)] required: List[String] l reduceLeft ((a, b) => a zip …

8
関数型言語(具体的にはErlang)はどのように/なぜ適切にスケーリングしますか?
しばらくの間、関数型プログラミング言語と機能の可視性の高まりを見てきました。私はそれらを調べましたが、上訴の理由はわかりませんでした。 その後、最近、CodemashでのKevin Smithの "Basics of Erlang"プレゼンテーションに参加しました。 私はプレゼンテーションを楽しみ、関数型プログラミングの属性の多くにより、スレッド化/同時実行の問題を回避することがはるかに容易になることを学びました。状態と可変性の欠如により、複数のスレッドが同じデータを変更することが不可能になることを理解していますが、Kevinは(正しく理解していれば)すべての通信はメッセージを通じて行われ、メッセージは同期して処理されます(ここでも同時実行の問題を回避します)。 しかし、Erlangが非常にスケーラブルなアプリケーションで使用されていることを読んだことがあります(Ericssonが最初にそれを作成した理由の全体)。すべてが同期的に処理されるメッセージとして処理される場合、1秒あたり数千のリクエストを効率的に処理する方法を教えてください。それが、非同期処理に移行し始めた理由ではありませんか?複数の操作スレッドを同時に実行することを利用して、スケーラビリティを実現できますか?このアーキテクチャはより安全ですが、スケーラビリティの点で後退しているようです。何が欠けていますか? Erlangの作成者が並行性の問題を回避するために意図的にスレッド化のサポートを回避したことは理解していますが、スケーラビリティを実現するにはマルチスレッド化が必要だと思いました。 関数型プログラミング言語はどのようにして本質的にスレッドセーフでありながら、まだ拡張できるのでしょうか。

5
Rubyはテールコールの最適化を実行しますか?
関数型言語は、多くの問題を解決するために再帰を使用することになるため、それらの多くはTail Call Optimization(TCO)を実行します。TCOは、その関数の最後のステップとして、新しいスタックフレームを必要としないように、別の関数(またはこの関数自体、この機能はTCOのサブセットであるテール再帰除去とも呼ばれます)から関数を呼び出します。オーバーヘッドとメモリ使用量が減少します。 Rubyは明らかに関数型言語から多くの概念(ラムダ、マップなどの関数など)を「借用」しているため、奇妙なことに、Rubyは末尾呼び出しの最適化を実行しますか?

5
配列からストリーミングするときに整数を文字列にマッピングできないのはなぜですか?
このコードは動作します(Javadocで取得): List<Integer> numbers = Arrays.asList(1, 2, 3, 4); String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", ")); これはコンパイルできません: int[] numbers = {1, 2, 3, 4}; String commaSeparatedNumbers = Arrays.stream(numbers) .map((Integer i) -> i.toString()) .collect(Collectors.joining(", ")); IDEAは、「ラムダ式の互換性のない戻り値の型文字列」があることを教えてくれます。 どうして ?そしてそれを修正するには?


5
型推論の実装
ここでは、静的型付けと動的型付けについて興味深い議論がいくつかあります。コンパイル型チェック、ドキュメント化されたコードなどにより、私は一般に静的型付けを好みます。しかし、たとえばJavaのようにコードを整理すると、コードが乱雑になることに同意します。 だから私は自分の関数型言語を作り始めようとしています。型推論は実装したいことの1つです。私はそれが大きな主題であることを理解しています、そして私は以前に行われていない何かを作成しようとしているのではなく、基本的な推論だけをしています... これで私を助けるであろう何を読むべきかについてのポインタ?より理論的なカテゴリー理論/タイプ理論のテキストとは対照的に、より実用的/実用的なものが好ましい。データ構造/アルゴリズムを使用した実装に関するディスカッションテキストがある場合、それはすばらしいことです。

1
リストをリストに圧縮する方法
次のリストのリストを圧縮したい: >>> zip([[1,2], [3,4], [5,6]]) [[1,3,5], [2,4,6]] これはzip、リストが個々のコンポーネントに分割されている場合にのみ、現在の実装で実現できます。 >>> zip([1,2], [3,4], [5,6]) (1, 3, 5), (2, 4, 6)] リストを分割して個々の要素をに渡す方法がわかりませんzip。機能的な解決策が好ましい。

15
HaskellでHaskellインタープリターを作成する
古典的なプログラミング演習は、Lisp / SchemeでLisp / Schemeインタープリターを作成することです。完全な言語の能力を活用して、言語のサブセットのインタープリターを作成できます。 Haskellにも同様の演習はありますか?Haskellをエンジンとして使用して、Haskellのサブセットを実装したいと思います。もちろんそれは可能ですが、見ることができるオンラインリソースはありますか? これがその裏話です。 私は、Haskellを言語として使用して、私が教えている離散構造コースのいくつかの概念を探求するという考えを模索しています。この学期では、Haskellに影響を与えた小さな言語であるMirandaに落ち着きました。ミランダは私がやりたいことの約90%をしますが、ハスケルは約2000%します。:) したがって、私の考えは、Haskellの機能を正確に備え、他のすべてを許可しない言語を作成することです。生徒が進むにつれて、基本を習得したら、さまざまな機能を選択的に「オン」にすることができます。 教育学的な「言語レベル」は、JavaとSchemeを教えるためにうまく使用されてきました。彼らができることを制限することによって、彼らがあなたが教えようとしている構文と概念をまだ習得している間、彼らが足で自分自身を撃つことを防ぐことができます。そして、あなたはより良いエラーメッセージを提供することができます。

3
現在の機能的リアクティブプログラミング実装のステータスは何ですか?
Haskellでいくつかの単純な自動物理システム(振り子、ロボットアームなど)を視覚化しようとしています。多くの場合、これらのシステムは次のような方程式で記述できます。 df/dt = c*f(t) + u(t) ここでu(t)、ある種の「インテリジェントコントロール」を表します。これらのシステムは、関数型リアクティブプログラミングパラダイムに非常にうまく適合しているように見えます。 そこで、Paul Hudak氏の著書「The Haskell School of Expression」を手に取ってみたところ、そこに提示されているドメイン固有言語「FAL」(Functional Animation Language)は、私の単純なおもちゃシステムでは非常にうまく機能していることがわかりましたintegrate。効率的に使用するには少し面倒すぎるようですが、簡単に修正できます)。 私の質問は、今日のより高度な、または実用的なアプリケーションのための、より成熟した、最新の、よく維持された、パフォーマンス調整された代替手段は何ですか? このWikiページにはHaskellのいくつかのオプションがリストされていますが、以下の点については明確ではありません。 (私が理解しているように)このプログラミングパラダイムの発明者の1人であるConal Eliottのプロジェクト「reactive」のステータスは、少し古く見えます。私は彼のコードが好きですが、多分私は他のより最新の代替案を試すべきですか?構文/パフォーマンス/実行時の安定性の点で、それらの主な違いは何ですか? 2011年の調査のセクション6 から引用すると、「... FRPの実装は、レイテンシの保証が必要なドメインで効果的に使用するには、まだ十分に効率的または予測可能ではありません...」。FRPが15年以上存在しているという事実を考えると、調査はいくつかの興味深い可能な最適化を示唆していますが、このパフォーマンスの問題は少なくとも数年以内に解決するのが非常に、または本質的に難しい場合があるという印象を受けます。これは本当ですか? 調査の同じ著者は彼のブログで「時間の漏れ」について語っています。問題はFRPに固有のものですか、それとも純粋で厳密でない言語でプログラミングするときに一般的に発生する問題ですか?FRPベースのシステムを長期間にわたって安定させることは、十分に高性能ではないにしても、非常に難しいと思ったことはありませんか? これはまだ研究レベルのプロジェクトですか?プラントエンジニア、ロボット工学エンジニア、金融エンジニアなどの人々が実際にそれらを使用していますか(ニーズに合った言語で)? 私は個人的にはHaskellの実装を好んでいますが、他の提案も受け入れています。たとえば、Erlangを実装するのは特に楽しいでしょう-インテリジェントで適応性のある、自己学習型のサーバープロセスを用意するのは非常に簡単です。

6
JavaScriptのポリモーフィズムとは何ですか?
ポリモーフィズムについてインターネットで見つけた可能性のある記事をいくつか読んだことがあります。でも、その意味とその重要性がよくわからなかったと思います。ほとんどの記事では、なぜそれが重要であり、OOPで(もちろんJavaScriptで)多相的な動作を実現できるかについては触れていません。 それを実装する方法がわからないので、コード例を提供することはできません。 それは何ですか? なぜそれが必要なのですか? 使い方? JavaScriptでこのポリモーフィックな動作を実現するにはどうすればよいですか? 私はこの例を持っています。しかし、このコードの結果がどうなるかは簡単に理解できます。ポリモーフィズム自体についての明確な考えはありません。 function Person(age, weight) { this.age = age; this.weight = weight; this.getInfo = function() { return "I am " + this.age + " years old " + "and weighs " + this.weight +" kilo."; } } function Employee(age, weight, salary) { this.salary = salary; …

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