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

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

10
データベースと関数型プログラミングは対立していますか?
私はしばらくの間Web開発者でしたが、最近、関数型プログラミングの学習を始めました。他の人のように、私はこれらの概念の多くを私の仕事に適用するいくつかの重大な問題を抱えてきました。私にとって、これの主な理由は、FPのステートレスを維持するという目標の間の矛盾が、私が行ったほとんどのWeb開発作業が非常にデータ中心のデータベースに強く結び付けられているという事実とかなり矛盾しているように見えることです。 OOP側でより生産的な開発者になった1つのことは、.GeneのMyGeneration d00dads、PerlのClass :: DBI、RubyのActiveRecordなどのオブジェクトリレーショナルマッパーの発見でした。終日、INSERTステートメントとSELECTステートメントを記述したり、オブジェクトとしてデータを簡単に操作したりすることに集中できます。もちろん、SQLクエリを作成することもできましたが、SQLクエリの能力が必要な場合はそれを実行できましたが、それ以外の場合は裏側でうまく抽象化されました。 さて、関数型プログラミングに移ると、リンクのようなFP Webフレームワークの多くでは、この例のように、ボイラープレートSQLコードを大量に記述する必要があるようです。Weblocksは少し優れているように見えますが、データを操作するために一種のOOPモデルを使用しているようで、この例のように、データベース内のテーブルごとにコードを手動で作成する必要があります。いくつかのコード生成を使用してこれらのマッピング関数を記述していると思いますが、それは明らかにLispに似ていません。 (私はWeblocksやLinksを非常に詳しく見ていないことに注意してください。それらがどのように使用されているのか誤解しているだけかもしれません)。 したがって、問題は、Webアプリケーションのデータベースアクセス部分(かなり大きいと思います)、またはSQLデータベースとのインターフェイスを必要とするその他の開発では、次のいずれかの方法を強制されるようです。 関数型プログラミングを使用しない 大量のSQLまたはSQLに似たコードをリンクを手動で作成することを含む、煩わしい、抽象化されていない方法でデータにアクセスする 関数型言語を強制的に擬似OOPパラダイムにし、真の関数型プログラミングの優雅さと安定性の一部を取り除きます。 明らかに、これらのオプションはどれも理想的ではないようです。これらの問題を回避する方法を見つけましたか?ここに本当に問題がありますか? 注:私は個人的にFPの前にあるLISPに最も精通しているので、例を挙げて複数のFP言語を知りたい場合は、おそらくlispが最適な言語でしょう PS:Web開発の他の側面に固有の問題については、この質問を参照してください。

16
Haskellの初心者ガイド?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 8年前に閉鎖。 私はしばらく前からHaskellのまともなガイドを探していましたが、読み通すのに十分興味深いと思われるガイドや、意味のあるガイドを見つけることができませんでした。 私は数年前にHaskellに接触したことがありますが、それについてはあまり思い出せません。やっと手に入れたときは「あはっ!」という感覚が凄くて、実は楽しかったので、失われたハスケルのアートを再発見したいと思っています。 私はRubyとその関数型プログラミングの手法に精通しているので、完全に暗闇の中にいるわけではないと思います。リンクは?

4
フォールドとリデュースの違いは?
F#を学習しようとしましたが、フォールドとリデュースを区別しようとすると混乱しました。Foldも同じように見えますが、追加のパラメーターを受け取ります。これらの2つの機能が存在する正当な理由はありますか、それとも背景が異なる人々に対応するためにありますか?(例:文字列およびC#の文字列) これは、サンプルからコピーしたコードスニペットです。 let sumAList list = List.reduce (fun acc elem -> acc + elem) list let sumAFoldingList list = List.fold (fun acc elem -> acc + elem) 0 list printfn "Are these two the same? %A " (sumAList [2; 4; 10] = sumAFoldingList [2; 4; 10])


10
これは純粋な関数ですか?
ほとんどのソースは、純粋な関数を次の2つのプロパティを持つものとして定義します。 同じ引数の場合、その戻り値は同じです。 その評価には副作用はありません。 それは私が心配する最初の状態です。ほとんどの場合、判断は簡単です。次のJavaScript関数を検討してください(この記事に示すように) 純粋: const add = (x, y) => x + y; add(2, 4); // 6 不純: let x = 2; const add = (y) => { return x += y; }; add(4); // x === 6 (the first time) add(4); // x === 10 (the second time) …

9
関数型プログラミングの「fold」関数に相当する「pythonic」とは何ですか?
Haskellで次のようなことを実現する最も慣用的な方法は何ですか? foldl (+) 0 [1,2,3,4,5] --> 15 またはRubyでの同等のもの: [1,2,3,4,5].inject(0) {|m,x| m + x} #> 15 明らかに、Pythonはreduce上記とまったく同じように、foldの実装である関数を提供しますが、プログラミングの「pythonic」の方法は、lambda項と高次関数を避け、可能な場合はリスト内包を優先することだと言われました。したがって、リスト、またはreduce関数ではないPythonのリストのような構造を折りたたむ好ましい方法はありますか、またはreduceこれを達成する慣用的な方法はありますか?

9
手続き型と機能型の違いを真に理解する
手続き型プログラミングと関数型プログラミングの違いを理解するのに本当に苦労しています。 次に、関数型プログラミングに関するWikipediaエントリの最初の2つの段落を示します。 コンピュータサイエンスでは、関数型プログラミングは、計算を数学関数の評価として扱い、状態や可変データを回避するプログラミングパラダイムです。状態の変化を強調する命令型プログラミングスタイルとは対照的に、関数の適用を強調します。関数型プログラミングは、関数定義、関数適用、および再帰を調査するために1930年代に開発された正式なシステムであるラムダ計算にルーツがあります。多くの関数型プログラミング言語は、ラムダ計算の詳細と見なすことができます。 実際には、数学関数と命令型プログラミングで使用される「関数」の概念の違いは、命令型関数には副作用があり、プログラムの状態の値を変更する可能性があることです。このため、それらには参照透過性がありません。つまり、同じ言語式は、実行中のプログラムの状態に応じて、異なる時点で異なる値になる可能性があります。逆に、関数コードでは、関数の出力値は関数に入力された引数にのみ依存するfため、引数に同じ値を指定して関数を2回呼び出す xと、同じ結果が生成されますf(x)両方の時間。副作用をなくすことで、プログラムの動作の理解と予測がはるかに容易になります。これは、関数型プログラミングを開発するための主要な動機の1つです。 それが言うパラグラフ2で 逆に、関数コードでは、関数の出力値は関数に入力された引数にのみ依存するfため、引数に同じ値を指定して関数を2回呼び出すxと、同じ結果がf(x)両方とも生成されます。 これは、手続き型プログラミングの場合とまったく同じではありませんか? 際立っている手続き型と機能型のどちらを探すべきですか?

1
ジッパーがコモナドである理由の理解
これは私の前の質問に対する回答のフォローアップです。 私は、各項目をマッピングする必要があるとa:AのList[A]のb:B機能をdef f(a:A, leftNeighbors:List[A]): Bして生成しますList[B]。 もちろんmap、リストを呼び出すだけではなく、リストジッパーを使用できます。ジッパーは、リスト内を移動するためのカーソルです。現在の要素(focus)とその隣接要素へのアクセスを提供します。 今、私は自分を置き換えることができfて def f'(z:Zipper[A]):B = f(z.focus, z.left)、この新しい関数を渡すf'にcobindする方法Zipper[A]。 これcobindは次のように機能します。f'ジッパーでそれを呼び出してから、ジッパーを移動f'し、新しい「移動した」ジッパーで呼び出し、ジッパーを再び移動し、以下同様に、ジッパーがリストの最後に到達するまで続けます。 最後に、cobindはタイプの新しいジッパーを返しますZipper[B]。これはリストに変換できるため、問題は解決されます。 今の対称性を注意cobind[A](f:Zipper[A] => B):Zipper[B]し、bind[A](f:A => List[B]):List[B]だからこそListであるMonadとZipperされますComonad。 理にかなっていますか?


30
JavaScriptの複数配列のデカルト積
OverаэтотвопросестьответынаStack Overflowнарусском:Декартовопроизведениенесколькихмассивов JavaScriptで複数の配列のデカルト積をどのように実装しますか? 例として、 cartesian([1, 2], [10, 20], [100, 200, 300]) 戻るはずです [ [1, 10, 100], [1, 10, 200], [1, 10, 300], [2, 10, 100], [2, 10, 200] ... ]

17
Haskellの大騒ぎは何ですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。私たちは回答が事実、参考文献、専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張された議論を誘います。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 8年前に閉鎖。 Haskellについて話をしているプログラマーが何人かいるのを知っています。そのため、ここでは誰もがその言語を気に入っているようです。Haskellが得意であることは、天才プログラマーの特徴のようです。 誰かがなぜそれがそんなにエレガントで優れているのかを示すいくつかのHaskellの例を挙げられますか?

7
F#開発と単体テスト?
私はF#を使い始めました。これは私の最初の関数型言語です。私はC#で準独占的に作業しており、F#でコードの記述方法を再考する方法をたくさん楽しんでいます。私が少し混乱していると思う1つの側面は、コードを書くプロセスの変更です。私はC#で何年もTDDを使用してきましたが、自分がどこにいるのかを知るための単体テストがあると本当に感謝しています。 これまでのところ、F#での私のプロセスは、いくつかの関数を記述し、それらが機能することを「合理的に」確認できるまで対話型コンソールで遊んで、調整して組み合わせることでした。これはオイラープロジェクトのような小規模な問題ではうまく機能しますが、そのように大きなものを構築することは想像できません。 人々はどのようにユニットテストに取り組み、F#プログラムのテストスイートを構築しますか?TDDに相当するものはありますか?ご意見やご感想をお寄せください。

5
機能的なデザインパターン[終了]
閉まっている。この質問はスタックオーバーフローのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善してみませんか?Stack Overflowのトピックとなるように質問を更新します。 4年前休業。 この質問を改善する モナド、アプリケーション、矢印など、機能的なイディオムはたくさんあります。それらはさまざまな記事に記載されていますが、残念ながら、それらが1か所にまとめられている本や記事はありません(Typeclassopediaがありますが、たくさんあります十分にカバーされていない領域の)。誰かが1か所で十分にカバーし、FPの中間スキルを持つプログラマーがアクセスできる記事/本を推薦できますか?

6
現実世界で関数型プログラミングを使用するにはどうすればよいですか?[閉まっている]
休業。この質問はもっと焦点を合わせる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 5年前に閉鎖。 この質問を改善する 関数型言語は、状態を排除することでバグを回避するだけでなく、スレッド数を気にすることなく簡単に自動的に並列化できるため、優れています。 しかし、Win32開発者として、アプリケーションの一部のDLLにHaskellを使用できますか?もしそうした場合、自動的に利用される本当の利点はありますか?もしそうなら、私にこの利点を与えるもの、コンパイラ? F#は、複数のコアとCPUにまたがって作成した関数を自動的に並列化しますか?タスクマネージャーのスレッド数が増えるのを見たことはありますか? 基本的に私の質問は、どのようにHaskellを実用的な方法で使い始めることができるか、そして私が実際に使用するといくつかの利点が得られるかどうかです。

6
シーケンスのPython'enumerate 'に相当するES6とは何ですか?
Pythonには、反復可能なペアを取得するための組み込み関数enumerateがあり(index, item)ます。 ES6にはアレイに相当するものがありますか?それは何ですか? def elements_with_index(elements): modified_elements = [] for i, element in enumerate(elements): modified_elements.append("%d:%s" % (i, element)) return modified_elements print(elements_with_index(["a","b"])) #['0:a', '1:b'] ES6と同等enumerate:なし function elements_with_index(elements){ return elements.map(element => elements.indexOf(element) + ':' + element); } console.log(elements_with_index(['a','b'])) //[ '0:a', '1:b' ]

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