問題タブ [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 投票する
1 に答える
675 参照

elm - 関数の結果をelmにキャッシュする方法はありますか?

O(1)複雑さと前処理でn番目のフィボナッチ数を計算したいO(n_max)

そのためには、次の C++ コードのように、以前に計算された値を保存する必要があります。

しかし、Elm では許可されていない副作用に依存しています。

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

haskell - 状態を直接渡す代わりに、状態モナドを使用する必要があるのはなぜですか?

状態モナドが状態を直接渡すよりも優れている簡単な例を誰かが示すことができますか?

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

python - 関数がPythonで純粋かどうかを確認するには?

純粋な 関数、数学関数に似た関数であり、「実世界」との相互作用も副作用もありません。より実用的な観点からは、純粋な関数では次のことができないことを意味します。

  • メッセージを印刷または表示する
  • ランダムにする
  • システム時刻に依存
  • グローバル変数を変更する
  • その他

このすべての制限により、非純粋関数よりも純粋関数について推論する方が簡単になります。プログラムのバグが少なくなるように、大部分の関数を純粋にする必要があります。

Haskell のような巨大な型システムを持つ言語では、読者は関数が純粋かどうかを最初からすぐに知ることができるため、後続の読み取りが容易になります。

@purePython では、この情報は、関数の上に置かれたデコレーターによってエミュレートされる場合があります。また、そのデコレーターが実際に検証作業を行うことも望んでいます。私の問題は、そのようなデコレータの実装にあります。

今のところ、関数のソース コードを調べて、または、または、およびそれらのいずれかが見つかった場合に不平を言うなどの流行語をglobal探しrandomますprint

しかし、あなたの運次第でうまくいくかもしれないし、うまくいかないかもしれない奇妙なハックのように感じます。より良いデコレータを書くのを手伝ってくれませんか?

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

functional-programming - Okasaki's Purely Functional Data Structure のストリームの章

ストリームの紹介の章で、岡崎氏はdropオンストリームの 2 つの実装を提供しています。ここに画像の説明を入力

彼は、2 番目の方が効率的であると明言していますが (両方とも同じセマンティクスを持っています)、一方が他方よりも効率的である理由がわかりません。どんな洞察も大歓迎です。

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

haskell - Haskellで入力を変更すると構成が壊れますか?

in haskellのドキュメントを読んでいるとSDL、一部の関数が必然的にその入力を変更することがわかりました。たとえば、blitSurface入力としてデスティネーション サーフェスがありますが、関数内で更新されます。さて、問題を一般化すると、関数がある場合、関数内でf :: a -> IO a変更すると構成が壊れaますか? どうf :: IO a -> IO aですか?どうa -> IO ()ですか?そしてどうIO a -> IO ()ですか?

blitSurfaceが実際には外部関数であり、フレームごとに新しいサーフェスを作成するのはあまり効率的ではないことを考えると、これらの関数を避けるのは困難です。そのような関数は、より大きなスケールで問題を引き起こしますか? たとえば、fModifySurface :: Surface -> IO ()破壊的な更新を行う which を例として使用すると、次のようになります。

上記のコードに予期しないセマンティクスはありますか? もしそうなら、入力を変更する外部関数を利用する最良の方法は何ですか?

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

algorithm - 純粋に機能的な深さ優先検索を使用するときに循環を防ぐ方法

以下に定義されているデータ型を使用して、任意のノードを接続するエッジのリストとして実装されているグラフがあります。

サイクルに行き詰まるのを避けながら、純粋に機能的な深さ優先検索を実行するにはどうすればよいですか? 純粋に機能を維持しながら、アクセスしたすべてのノードを追跡する方法がよくわかりません。答えはおそらく、何らかの理由で私が概念的に把握していない些細なことです。

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

c - Haskell: 変数への最後の参照を使用して、新しい変数を効率的に作成する

この C コードは、入力配列と同じであるが最初の要素として 1 を持つ新しい配列を作成するものとして概念的に説明できます。

これは、入力配列とその要素がさらに参照されない限り、純粋な関数 (wink wink nudge nudge) です。C 型システムはそれを強制しませんが、原則として強制できるようです。

gcc が生成するコードはシンプルで効率的です。

私たちの関数は、まったく新しい配列を一定時間で作成し、追加のメモリを使用しないことで、一見不可能なことを実現します。良い。同様のコードで有効に実装できる、配列のような入力と出力を持つ Haskell 関数を作成できますか? 純粋な関数が舞台裏で変数を共食いできるように、「これがこの変数への最後の参照です」と表現する方法はありますか?

関数がインライン化された場合、ここで興味深いことは何も起こらないので、呼び出し元と関数が別々にコンパイルされると仮定しましょう。

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

haskell - `ST` ライクなモナドは (`ST` ライブラリなしで) 純粋に実行できますか?

この投稿はリテラシーな Haskell です。「pad.lhs」のようなファイルを入れるだけでghci実行できます。

STさて、モナドを純粋なコードで表現する方法を理解することができました。まず、参照型から始めます。その特定の値はそれほど重要ではありません。最も重要なことは、PT s a他の型と同型であってはならないということforall sです。()(特に、どちらとも同形である必要はありませんVoid。)

の種類はsですが*->*、現時点ではあまり重要ではありません。それはpolykindである可能性があります。

かなり簡単です。AndThenこれを として使用できますMonadreturnがどのように実装されているのか疑問に思われるかもしれません。runPF以下はそのモナドのインスタンスです (後で定義されるに関するモナド法則のみを尊重します):

fibこれで、テスト ケースとして定義できます。

そして、それはチェックを入力します。万歳!これで、これを に変換できましたST(なぜ でsなければならなかったのかがわかります* -> *)

これで、まったくPT参照せずに実行する関数を定義できます。ST

runPF $ fib 7これは13正しいです。


runPF私の質問は、まったく使用せずに参照なしで定義できますSTか?

定義する純粋な方法はありますrunPFか? PTRefの定義はまったく重要ではありません。とにかく、それは単なるプレースホルダー型です。それを機能させるものに再定義できます。

純粋に定義できない場合は、できないrunPFことを証明してください。

パフォーマンスは問題ではありません (もしそうなら、私はすべてreturnに独自の参照を持たせなかったでしょう)。

存在型が役に立つかもしれないと考えています。

a注:が動的か何かであると仮定すると、それは自明です。すべてで機能する答えを探していますa

注: 実際、答えは とは必ずしも関係ありませんPTST魔法を使わないのと同じくらい強力である必要があります。(からの変換(forall s. PT s)は、回答が有効かどうかの一種のテストです。)