問題タブ [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.
elm - 関数の結果をelmにキャッシュする方法はありますか?
O(1)
複雑さと前処理でn番目のフィボナッチ数を計算したいO(n_max)
。
そのためには、次の C++ コードのように、以前に計算された値を保存する必要があります。
しかし、Elm では許可されていない副作用に依存しています。
haskell - 状態を直接渡す代わりに、状態モナドを使用する必要があるのはなぜですか?
状態モナドが状態を直接渡すよりも優れている簡単な例を誰かが示すことができますか?
対
python - 関数がPythonで純粋かどうかを確認するには?
純粋な 関数は、数学関数に似た関数であり、「実世界」との相互作用も副作用もありません。より実用的な観点からは、純粋な関数では次のことができないことを意味します。
- メッセージを印刷または表示する
- ランダムにする
- システム時刻に依存
- グローバル変数を変更する
- その他
このすべての制限により、非純粋関数よりも純粋関数について推論する方が簡単になります。プログラムのバグが少なくなるように、大部分の関数を純粋にする必要があります。
Haskell のような巨大な型システムを持つ言語では、読者は関数が純粋かどうかを最初からすぐに知ることができるため、後続の読み取りが容易になります。
@pure
Python では、この情報は、関数の上に置かれたデコレーターによってエミュレートされる場合があります。また、そのデコレーターが実際に検証作業を行うことも望んでいます。私の問題は、そのようなデコレータの実装にあります。
今のところ、関数のソース コードを調べて、または、または、およびそれらのいずれかが見つかった場合に不平を言うなどの流行語をglobal
探しrandom
ますprint
。
しかし、あなたの運次第でうまくいくかもしれないし、うまくいかないかもしれない奇妙なハックのように感じます。より良いデコレータを書くのを手伝ってくれませんか?
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 を例として使用すると、次のようになります。
上記のコードに予期しないセマンティクスはありますか? もしそうなら、入力を変更する外部関数を利用する最良の方法は何ですか?
algorithm - 純粋に機能的な深さ優先検索を使用するときに循環を防ぐ方法
以下に定義されているデータ型を使用して、任意のノードを接続するエッジのリストとして実装されているグラフがあります。
サイクルに行き詰まるのを避けながら、純粋に機能的な深さ優先検索を実行するにはどうすればよいですか? 純粋に機能を維持しながら、アクセスしたすべてのノードを追跡する方法がよくわかりません。答えはおそらく、何らかの理由で私が概念的に把握していない些細なことです。
c - Haskell: 変数への最後の参照を使用して、新しい変数を効率的に作成する
この C コードは、入力配列と同じであるが最初の要素として 1 を持つ新しい配列を作成するものとして概念的に説明できます。
これは、入力配列とその要素がさらに参照されない限り、純粋な関数 (wink wink nudge nudge) です。C 型システムはそれを強制しませんが、原則として強制できるようです。
gcc が生成するコードはシンプルで効率的です。
私たちの関数は、まったく新しい配列を一定時間で作成し、追加のメモリを使用しないことで、一見不可能なことを実現します。良い。同様のコードで有効に実装できる、配列のような入力と出力を持つ Haskell 関数を作成できますか? 純粋な関数が舞台裏で変数を共食いできるように、「これがこの変数への最後の参照です」と表現する方法はありますか?
関数がインライン化された場合、ここで興味深いことは何も起こらないので、呼び出し元と関数が別々にコンパイルされると仮定しましょう。
haskell - `ST` ライクなモナドは (`ST` ライブラリなしで) 純粋に実行できますか?
この投稿はリテラシーな Haskell です。「pad.lhs」のようなファイルを入れるだけでghci
実行できます。
ST
さて、モナドを純粋なコードで表現する方法を理解することができました。まず、参照型から始めます。その特定の値はそれほど重要ではありません。最も重要なことは、PT s a
他の型と同型であってはならないということforall s
です。()
(特に、どちらとも同形である必要はありませんVoid
。)
の種類はs
ですが*->*
、現時点ではあまり重要ではありません。それはpolykindである可能性があります。
かなり簡単です。AndThen
これを として使用できますMonad
。return
がどのように実装されているのか疑問に思われるかもしれません。runPF
以下はそのモナドのインスタンスです (後で定義されるに関するモナド法則のみを尊重します):
fib
これで、テスト ケースとして定義できます。
そして、それはチェックを入力します。万歳!これで、これを に変換できましたST
(なぜ でs
なければならなかったのかがわかります* -> *
)
これで、まったくPT
参照せずに実行する関数を定義できます。ST
runPF $ fib 7
これは13
正しいです。
runPF
私の質問は、まったく使用せずに参照なしで定義できますST
か?
定義する純粋な方法はありますrunPF
か? PTRef
の定義はまったく重要ではありません。とにかく、それは単なるプレースホルダー型です。それを機能させるものに再定義できます。
純粋に定義できない場合は、できないrunPF
ことを証明してください。
パフォーマンスは問題ではありません (もしそうなら、私はすべてreturn
に独自の参照を持たせなかったでしょう)。
存在型が役に立つかもしれないと考えています。
a
注:が動的か何かであると仮定すると、それは自明です。すべてで機能する答えを探していますa
。
注: 実際、答えは とは必ずしも関係ありませんPT
。ST
魔法を使わないのと同じくらい強力である必要があります。(からの変換(forall s. PT s)
は、回答が有効かどうかの一種のテストです。)