2

DrRacket をスキーム コンパイラとして使用しています。fold-right 関数を使用しようとすると、「fold-right: unbound identifier in module in: fold-right」が表示されました。この関数を呼び出す前にライブラリを含める必要がありますか?

ありがとうございました!

4

2 に答える 2

7

を探していると思いますfoldrfoldrは、fold-right のラケット実装です。

ドキュメントから:

と同様mapに、foldl1 つ以上のリストの要素にプロシージャを適用します。map戻り値をリストに結合するのに対しfoldl 、proc によって決定される任意の方法で戻り値を結合します。

[…]

[foldrは ] と似foldlていますが、リストは右から左にトラバースされます。とは異なりfoldlfoldrlsts の長さに比例するスペースで lsts を処理します (および proc への各呼び出しのスペース)。

編集:

Chrisが提案した srfi/1 ライブラリを使用することもできます。特に、右折がsrfi/1 の推奨事項のように機能することを期待している場合はそうです。いくつかの微妙な違いがあります:

#lang racket
(require srfi/1)
(foldr list* '() '(a b c) '(1 2 3))
(fold-right list* '() '(a b c) '(1 2 3 4))
(foldr list* '() '(a b c) '(1 2 3 4))

出力:

Welcome to DrRacket, version 5.3 [3m].
Language: racket; memory limit: 128 MB.
'{a 1 b 2 c 3}
'{a 1 b 2 c 3}
[ERROR] foldr: given list does not have the same size as the first list: '{1 2 3 4}

注:fold-right異なるサイズのリストでエラーは発生しませんが、2 番目のリストからは 1、2、3 個の原子しか取得できません。これは srfi/1 仕様と一致します:

折り畳み操作は、最短リストの値がなくなると終了します

foldrエラーします。

于 2012-09-21T12:40:36.787 に答える
1

(require (only-in srfi/1 fold-right))コードの先頭に追加する必要があります。

于 2012-09-21T13:07:31.800 に答える