問題タブ [letrec]
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.
recursion - *再帰的*関数リテラル/無名関数をサポートする言語は?
最近では、かなりの数の主流言語が関数リテラルをサポートしているようです。無名関数とも呼ばれますが、名前があっても構いません。重要なことは、関数リテラルは、他の場所でまだ定義されていない関数を生成する式であるため、たとえば C では&printf
カウントされないということです。
追加する編集:本物の関数リテラル式がある場合は、それを関数に渡すか、すぐに引数に適用<exp>
できるはずです。.f(<exp>)
<exp>(5)
recursiveである関数リテラルを記述できる言語はどれか知りたいです。ウィキペディアの「匿名再帰」の記事には、プログラミングの例はありません。
再帰的階乗関数を例として使用しましょう。
ここに私が知っているものがあります:
JavaScript / ECMAScript でそれを行うことができます
/li>callee
:を使用する言語では簡単です
letrec
。たとえば、Haskell (これはそれを呼び出しますlet
):let fac x = if x<2 then 1 else fac (x-1) * x in fac
LispとSchemeにも同等のものがあります。のバインディングは
fac
式に対してローカルであるため、式全体が実際には無名関数であることに注意してください。
他にもありますか?
functional-programming - letrecの利点は何ですか?
「TheSeasonedSchemer」を読みながら、私はについて学び始めましたletrec
。私はそれが何をするのかを理解しています(Y-Combinatorで複製できます)が、本はdefine
静的なままの引数で動作するすでにd関数を繰り返す代わりにそれを使用しています。
define
それ自体で繰り返されるd関数を使用する古い関数の例(特別なことは何もありません):
同じ関数の例ですが、以下を使用しletrec
ます。
少し長くて読みにくいことを除けば、なぜ彼らがletrecを使用するために本の関数を書き直しているのかわかりません。あなたがそれを渡し続けないので、このように静的変数を繰り返すときの速度の向上はありますか?
これは、引数が静的なままであるが、1つの引数が削減されている関数(リストの要素を繰り返すなど)の標準的な方法ですか?
より経験豊富なSchemers/LISPersからのいくつかの入力が役立ちます!
haskell - fix はどのように使用し、どのように機能しますか?
のドキュメンテーションに少し戸惑ったのでfix
(現在は何をすべきかは理解できたと思いますが)、ソース コードを調べました。それは私をもっと混乱させました:
これはどのくらい正確に固定点を返しますか?
コマンドラインで試してみることにしました:
そして、それはそこにぶら下がっています。公平を期すために、これは私の古いMacbookにあり、少し遅いです。ただし、この関数は、id に渡されたものはすべて同じ結果を返すため、計算コストが高すぎることはありません(言うまでもなく、CPU 時間を消費しません)。私は何を間違っていますか?
recursion - スキーム: letrec で定義されたこの再帰関数の評価が失敗するのはなぜですか?
私はSchemeでばかげたletrecを書いています(DrRacket Pretty Big):
構文チェックは問題ありませんでしたが、実行すると次のように失敗します。
デバッガーは、障害の時点で次のように言います。
何が足りないのか教えてください。修正もいいでしょうが、必要ではありませんが、定義しないでください。
ありがとうございました!
scheme - 'letrec' をパターンマッチする方法
match-lambda を使用して letrec への一致呼び出しをパターン化しようとしています。このパターンは次のように私には思えます:
次の形式の呼び出しに一致する必要があります。
しかし、もちろん、これは機能しません。
アドバイスをいただければ幸いです。
haskell - 不動点を計算する関数の変換
反復の観点から不動点を計算する関数があります。
これから次のように抽象化できることに注意してください。
この関数は修正の観点から書くことができますか?このスキームから修正されたものへの変換があるはずのようですが、私にはわかりません。
variables - 「set!」を使わずに「letrec」を実装するにはどうすればよいですか?
を使用せずにどのletrec
ように実装できますset!
か?
set!
これは命令型プログラミング構造であり、それを使用すると関数型プログラミングの利点が失われるように私には思えます。
scala - Scalaのletrec? (「結び目を作る」ための不変の方法)
次のようなばかげた小さなケース クラスがあるとします。
is 、 is 、isなどa
をb
不変に定義するにはどうすればよいですか? scala は「結び目を作る」方法を提供していますか? 私はこのようなことをしたいと思います:a.other
b
b.other
a
可能性
Haskell では、次のようにします。
a
およびへのバインディングがb
同じlet
式に含まれている場所、または最上位にある場所。
または、Haskell の自動 letrec 機能を悪用せずに:
遅延パターン に注意してください。これは~(a', b')
重要です。
variables - ローカルバインディングを作成するための「let」または「letrec」と「define」の違いは何ですか?
違いがわかりません(不自然な例で申し訳ありません):
と
私が知る限り、それらは両方とも新しいスコープを作成し、そのスコープ内で相互に参照する 4 つのローカル変数を作成し、本体を評価して返します。
ここで何か不足していますか、それともスコープ付きsletrec
と同義ですか?define
これは実装に依存する可能性があることを知っています。Lips の基礎を理解しようとしています。
haskell - シャドウイング`let`バインディングを使用するこのコードがハングするのはなぜですか?
このコードの実行:
通訳で:
CPU使用率がほとんどない状態でハングします。どうしてこれなの?期待していj = 16
ました。