質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Scheme

Schemeは、Lispから派生したプログラミング言語の一つであり、仕様または実装を指す場合もあります。言語自体の仕様はシンプルで、関数型言語として理解しやすいことから記号処理などで主に用いられている言語です。

Q&A

解決済

1回答

1167閲覧

Schemeの(fold-left append '() all-freqs)の意味が分からない

ruei

総合スコア284

Scheme

Schemeは、Lispから派生したプログラミング言語の一つであり、仕様または実装を指す場合もあります。言語自体の仕様はシンプルで、関数型言語として理解しやすいことから記号処理などで主に用いられている言語です。

0グッド

0クリップ

投稿2019/06/06 00:24

Schemeで書かれた状態密度を求めるコードを解読しています。

この中で次のようなfold-leftという関数が登場しており、何をしているのかが分かりません。

Scheme

1(define (all-freqs-broaden) 2 (broaden (fold-left append '() all-freqs)))

all-freqは2次元配列で
all-freq[i] が i番目のk点の共鳴周波数の配列
だと理解しています。

上のコードが何をしているのか分かる方いらっしゃったらご教示お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

fold 系関数は畳み込みと呼ばれるパターンを処理するもので、そのバリエーションについては以下の URL にある図がわかりやすいです。

http://blog.practical-scheme.net/shiro/20120314-fold

では具体的に (fold-left append '() all-freqs) が何をやっているのかというと、リストに含まれる複数のリストをつなげようとしています。

例えば all-freqs の中身が '((a b c) (d e f) (g h i)) であったとしたら、この処理を通した結果は '(a b c d e f g h i) というように、括弧を一段階はがしたような形になります。

投稿2019/06/06 04:56

SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruei

2019/06/06 09:15

なるほど、リンク先のopというのはopという演算によってつなげるということを表しているんですね。 この場合だと、各k点について周波数のリストがあったのを一個のリストにまとめているんですね。 '((a b c) (d e f) (g h i)) が '(a b c d e f g h i) になるという例がめっちゃわかりやすかったです。 ありがとうございます。
SaitoAtsushi

2019/06/06 10:27

質問の範疇から外れるので余談ではありますが、 fold-left に append を渡すのはあまり効率の良くないコードである可能性があります。 append は引数の最後に渡されたリストは結果と共有する、逆に言えば最後の引数以外はコピーが生じます。 fold-left の順序で append を適用すると最終的に捨てる無駄なコピーをたくさんやってしまいます。 似たような事例について説明を書いたことがあるので参考にしてください。 https://saito.hatenablog.jp/entry/2014/03/28/184636 fold-left のかわりに fold-right を使えばコピーは一度だけになるので無駄が少なくて良いでしょう。 fold-left よりも fold-right の方がスタックを消費する可能性がありますが、無駄なコピーをするよりはたぶんマシです。 あるいは、もし使っている処理系が srfi-1 をサポートしているのであれば concatenate が使えるかもしれません。 concatenate はリスト中のリストを結合する手続きです。 ただし、結果として出力されるリストの一部が元リストと共有されるので、それが問題にならないかどうか用途に対して注意深く検討する必要があるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問