DrRacket をスキーム コンパイラとして使用しています。fold-right 関数を使用しようとすると、「fold-right: unbound identifier in module in: fold-right」が表示されました。この関数を呼び出す前にライブラリを含める必要がありますか?
ありがとうございました!
を探していると思いますfoldr
。 foldrは、fold-right のラケット実装です。
ドキュメントから:
と同様
map
に、foldl
1 つ以上のリストの要素にプロシージャを適用します。map
戻り値をリストに結合するのに対しfoldl
、proc によって決定される任意の方法で戻り値を結合します。
[…]
[
foldr
は ] と似foldl
ていますが、リストは右から左にトラバースされます。とは異なりfoldl
、foldr
lsts の長さに比例するスペースで 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
エラーします。
(require (only-in srfi/1 fold-right))
コードの先頭に追加する必要があります。