自動プログラム合成のための単純な関数型言語を実装しようとしています。データ構造は関数と値のグラフであり、javascriptにコンパイルされます。次のグラフはフォールド関数である必要があります。 funcApp
ノードは関数ノードといくつかの値ノードに接続されており、関数を値に適用します。 arg0
はリスト、arg1
は初期値(z)arg2
は適用される関数です。
これは、folloiwngスキームの定義と同等です(私の「言語」はSchemeではありませんが、グラフです)
(define (foldr f z xs)
(if (null? xs)
z
(f (car xs) (foldr f z (cdr xs)))))
問題は、特別な演算子がないため、特にすべてがif
正常な関数であるということです。この形式では、else句が常に計算されるため、プログラムは終了せず、代わりに最大スタック深度に達します。
この問題は、遅延評価によって一部の言語で解決されると思います。したがって、私の質問は次のとおりです。この無限再帰を持たない機能バージョンのfoldはありますか2)必要に応じて、このような単純な言語に遅延評価を適用することを検討し始めます。