問題タブ [purely-functional]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
2560 参照

haskell - unsafePerformIO の一般的な使用を回避する方法

Haskell コードでこのパターンをよく見かけます。

基本的に、プログラムの開始時に最初に設定されたオプションなどの記録があります。optionsプログラマーは怠け者なので、プログラム全体に記録を残したくありません。彼はそれMVarを維持するために を定義しています - の醜い使い方によって定義されていますunsafePerformIO。プログラマーは、操作が行われる前に状態が一度だけ設定されるようにします。unsafePerformIOここで、オプションを抽出するためだけに、プログラムの各部分を再度使用する必要があります。

私の意見では、そのような変数は実用的に純粋であると考えられています(私を打ち負かさないでください)。この概念を抽象化し、変数が一度だけ設定されるようにするライブラリがありますか。つまり、その初期化の前に呼び出しが行われず、書き込む必要がないことを保証しますunsafeFireZeMissilesAndMakeYourCodeUglyAnd DisgustingBecauseOfThisLongFunctionName

0 投票する
2 に答える
767 参照

data-structures - F#PurelyFunctionalDataStructures WeightBiasedLeftistHeap ex 3.4

私は岡崎の純粋関数型データ構造に取り組んでおり、物事のF#実装を構築しようとしています。私はまた、本にリストされている演習を行っています(いくつかはかなり挑戦的です)。元の2パスの実装ではなく、シングルパスで実行されるようにWeightBiasedLeftistHeapのマージ関数を変更する必要がある演習3.4に固執しています。

私はまだこれを行う方法を理解することができず、いくつかの提案を望んでいました。SOに関する別の投稿があり、makeT関数をほぼインライン化することでSMLでそれを実行しています。私はこのルートを開始しました(コメントセクション3.4 First Tryで。しかし、これは実際にはシングルパスで実行されていないと思ったため、このアプローチを放棄しました(リーフに到達するまで、ツリーを巻き戻して再構築します)。それをまだ2パスマージであると解釈するのは間違っていますか?

これは、WeightBiasedLeftistHeapの完全な実装へのリンクです。

F#でこれを実行しようとして失敗したのは次のとおりです。

0 投票する
1 に答える
156 参照

functional-programming - Dの関数のタイプ

ある時点で渡される関数の導関数である関数を返す関数Derivativeを作成することに興味があります。ただし、これを特殊化して、特定の機能について分析ソリューションを返すことができるようにしたいと思います。

だから、私はこのようなものを探しています:

ただし、現在、BSplineは次のように定義されています。

したがって、BSplineの型アノテーションはReal関数(Real、Real)になります。これは、他の種類の関数と区別できません。これを解決して、opCallが定義された「BSpline」クラスを作成する方法はありますか?または、この関数を識別するために何らかのtypedefを実行できますか?

ありがとう!

0 投票する
2 に答える
558 参照

functional-programming - 機能と命令のハイブリッド

純粋な関数型プログラミング言語では変更可能なデータは許可されませんが、一部の計算は命令的な方法でより自然に/直感的に表現されます。または、アルゴリズムの命令的なバージョンがより効率的である場合があります。ほとんどの関数型言語は純粋ではないことを認識しており、変数の割り当て/再割り当てや命令的なことを実行できますが、一般的には推奨されません。

私の質問は、ローカル状態をローカル変数で操作できるようにしないで、関数が独自のローカル定数とグローバル定数 (または外部スコープで定義された定数のみ) にのみアクセスできるようにする必要があるのはなぜですか? このように、すべての関数は参照の透過性を維持します (同じ引数を指定すると、常に同じ戻り値を返します) が、関数内では、計算を命令語 (while ループなど) で表現できます。

IO などは、モナドを介して、または「世界」または「宇宙」トークンを渡すことにより、通常の機能的な方法で実現できます。

0 投票する
3 に答える
992 参照

lisp - Lisp関数を「純粋」と宣言する機能は有益でしょうか?

私は最近Haskellについてたくさん読んでいます、そしてそれが純粋に関数型言語であることから得られる利点。(私はLispのモナドについて議論することに興味がありません)(少なくとも論理的に)副作用のある関数を可能な限り分離することは私にとって理にかなっています。私はsetf他の破壊的な関数をたくさん使ってきました、そして私はLispと(ほとんどの)その派生物でそれらの必要性を認識しています。

どうぞ:

  1. (declare pure)コンパイラの最適化に役立つ可能性があるものはありますか?それとも、すでに知っているので、これは論点ですか?
  2. 宣言は、関数やプログラム、または少なくとも純粋であると宣言されたサブセットを証明するのに役立ちますか?それとも、プログラマー、コンパイラー、および証明者にはすでに明らかであるため、これも不要なものですか?
  3. 他に何もないとしても、コンパイラーがこの宣言で関数の純粋さを強制し、Lispプログラムの可読性/保守性を高めることはプログラマーにとって有用でしょうか?
  4. これは意味がありますか?それとも私は今考えることすらできないほど疲れていますか?

ここで洞察をいただければ幸いです。コンパイラの実装または証明可能性に関する情報は大歓迎です。

編集

明確にするために、私はこの質問をCommonLispに限定するつもりはありませんでした。それは明らかに(私が思うに)特定の派生言語には当てはまりませんが、他のLispのいくつかの機能がこの種の機能をサポートする(またはサポートしない)傾向があるかどうかも興味があります。

0 投票する
6 に答える
4164 参照

scala - Scalaを学ぶためにHaskellを学ぶ

Scala vs Haskell など、両方の言語の利点やどちらを学ぶべきかについて議論している質問をいくつか読みましたが、Scala を学びたいと思っていることはすでにわかっています。私は大学で Java プログラマーをしていましたが、現在は主に PHP を使用しています。

個人的なプロジェクトのために Java を改良したように見えるので、Scala を学びたいと思っています。また、プログラマーとしての知識を向上させるために関数型言語も学びたいと考えています。

Haskell は純粋に関数型であるため、関数型プログラミングの入門として Haskell を学ぶのは良い考えではないかと思います。そのため、Scala で関数型のビットを無計画に使用するのではなく、理由を知らずに適切に学習しますか?

Haskell は見栄えが良いので、個人的なプロジェクトなどにも使用したいと思いますが、現実世界でのアプリケーションはあまり見られず、学術的なものに使用されているようです。スカラに。

0 投票する
5 に答える
7105 参照

function - 「純粋な」関数が「純粋」と呼ばれるのはなぜですか?

純粋な関数とは、副作用のない関数です。どのような種類の I/O も実行できず、状態を変更することもできません。また、参照透過的です。同じ入力で複数回呼び出された場合、常に次の結果が返されます。同じ出力。

これらのプロパティを持つ関数を説明するために「純粋」という言葉が使用されるのはなぜですか? そのように「純粋」という言葉を最初に使ったのは誰で、いつですか? ほぼ同じことを意味する他の単語はありますか?

0 投票する
1 に答える
112 参照

algorithm - このリストを適切に反復するにはどうすればよいですか?

次の例は、問題を単純化したものです。私はリスト[Either Foo Bar]と別のリストを持っています[Biz]。アイデアは、最初から空になるまで、各Biz要素を繰り返すことです。その結果、より多くのsがより少なくなります。[Either Foo Bar][Either Foo Bar]BizBarFoo[Either Foo Bar]

[Either Foo Bar]問題は、の次の要素を使用するときの最初から開始できること[Biz]です。

それが助けになるなら、私がやろうとしていることの例を投稿することができます。

更新:これが私が使用している実際のタイプですが、それでも無関係な情報であると思われるものを除外しようとしています。重要なことを忘れてしまったら教えてください

[Either UnFlaggedDay CalendarDay] [(CalFlag,Product, Day)]

私がやろうとしているのはDay、のLeft値と照合することです[Either UnFlaggedDay CalendarDay]。一致するものを取得したら、次の変更を除いてまったく同じ新しいリストを作成します。これに加えて、リスト内のUnFlaggedDay次の2つをs [(CalFlag、Product、Day)] (CalFlag、ちょうどチェックされた製品、日)`。以下は、この問題に対する私のさまざまなアプローチの間にある壊れたコードです。UnflaggedDayCalendarDay. At that point, I want to use the newly built list, that has the same number of elements still, and theminus the

アップデート:

私は自分の考えを理解するためにいくつかのテストコードを作成しました。これが私がこれまでに持っているものです

さて、ここで私は立ち往生しています。次の3つの左の値を右の値に変更できるようにする必要があります。私の意図はdummyFunc'、最初のLeft値でリストを分割し、それを削除し、新しいRight値を追加し、以前に分割されたリストに参加し、さらに2回繰り返すことでした。もっと良い方法はありますか?そうでない場合、私が言及した基準に基づいてリストを半分に分割する関数はすでにありますか?手作業でそれを行う方法を理解することはできますが、私は車輪の再発明を試みているのではありません。

0 投票する
1 に答える
223 参照

tree - 純粋に機能的なツリーをローカルで編集する

木 T を定義しましょう:

新しいノードが E に追加され、T' が生成されたとします。

変更可能な言語では、これは簡単な作業です。E の子を更新するだけで完了です。ただし、不変の世界では、まず E へのパスを知り、次に E + 新しい子から E' を導出し、次に B' を導出し、最後に A' ( = T') を導出する必要があります。

これは面倒です。理想的には、E と G (および場合によっては T) の値を取り、E へのパスを提供せずに T' を生成する関数が存在します。

この問題に対処するには、次の 2 つの方法が考えられます。

  • 親参照 - このようにして、すべてのノードはルートへのパスを導出できます。2 つの問題: 相互に参照する 2 つのノード (つまり、親 <-> 子) を作成することは、純粋関数型言語の問題です (簡単な解決策はありますか?)。E -> E' が導出されるときはいつでも、E' の代わりに E の古い値を保存するため、E' のすべての子も新しく導出する必要があります。
  • ジッパー - すべてのノードは、親ジッパーから派生した作成時にジッパーを格納します。相互参照の問題は解消されますが、E -> E' が導出されると、E' の子のジッパーもすべて導出する必要があります。これは、古いツリー E を指しているためです。

合理的なパフォーマンスを念頭に置いて、私が望むことは可能ですか? ご意見をお寄せいただきありがとうございます。

0 投票する
1 に答える
388 参照

haskell - 純粋関数型グラフの編集

グラフと次のような関数のセットがあるとしましょう。

Graph主に便宜上(できればモナドなしで、コードの一部を操作するすべてのグラフをモナドブロックでラップする必要がないように)、引数として期待しない関数のバージョンを作成したいと思います。では、これについてはどうでしょうか。

またはより一般的に:

(Graph -> ...)そうすれば、通常のノードであるかのように値を使用できるようになります。最後に、(Graph -> ...)値から実際のグラフを取得するには、それを空のグラフに適用するだけです。これは合理的なアプローチですか?