19

SICPからSchemeを少し学んだ後、The Little Schemer(非常に面白いと思います)を読み始め、約4分の1が完了しました。ラムダを使用せずに多くの(ほとんど?すべて?)ソリューションを記述できるのに対し、LittleSchemerは常にそれらを使用していることに気付きました。たとえば、最初の定義は

(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))

私が間違っていない限り、これはもっと簡単に次のように書くことができます

(define (atom? x) 
   (and (not (pair? x)) (not (null? x))))

ラムダレスソリューションを作成する場合、基本的な何かが欠けていますか?

4

6 に答える 6

23

lambdaジェイが言うように、関数の作成をより明確にするので、私は教えるために-heavyスタイルを強く好みます。

学習するとき、あなたが始めるような単純な関数atom?defineトップレベルにあります。これは、あなたが言及したdefunスタイルで関数を作成することが可能であり、さらにコンパクトであることを意味します。define

ただし、関数をファーストクラスの値として使用し始めると、たとえば、の引数として、初めて表示されるようになり、実際よりも奇妙で魔法のように見える場合がありますmaplambda

代わりに、ずっと関数を定義しているのであれば、lambda関数が他の値とまったく同じであることがわかるのはそれほど飛躍的ではありません。それらはたまたまかなり頻繁に右側にありますがdefine、数値や引用符で囲まれた定数と同じです。

(define x 1)
(define l '(2 3 4 5))
(define s (cons x ls))
(define f (lambda (n) (+ n 2)))

もちろん、言語は両方の形式をサポートしているので、最終的にはスタイルになります。私にとって、defineすべての関数が次のように作成される場合の使用法には魅力的な一貫性がありますlambda。最初の引数は常にシンボルであり、2番目の引数は古い式です。lambdaそして、古い式とまったく同じであるという事実は、関数型プログラマーが学ぶための最も重要なことの1つです。

于 2011-01-24T03:02:26.543 に答える
15

もともと、define変数を値に設定するための単一の構文がありました。それはそのような古い(そして時代を超越した)本で使われているスタイルです。後でdefine、ショートカットとして別の構文を取得しました。これは、使用している構文です。

楽しみのために、Schemeライブラリを検索すると、非ラムダ形式を古いラムダ重い形式に展開するマクロが見つかる場合があります。

于 2011-01-24T01:49:57.417 に答える
8

スキームがこれらのショートカット(マクロ)を使用に拡張するものexpand(サポートされている場合)を確認できます。

mzscheme 4.2.4(DrSchemeを使用):

> (expand '(define (add1 x) (+ 1 x)))
#<syntax (define-values (add1) (lambda...>
(define-values
  (add1)
  (lambda (x) (apply + '1 x)))

Chezスキーム8.0:

> (expand '(define (add1 x) (+ 1 x)))
(begin
  (set! add1
    (lambda (x)
      (+ 1 x)))
  (void))

lambda日として明白に見えます。

于 2011-01-24T03:42:56.477 に答える
4

教授がこういうことを話し合ったのをぼんやりと覚えています。

ラムダソリューションは2つの理由で使用されていると思います。

最初のものは純粋に歴史的なものです。ある時点で、それが可能だった唯一の方法でした。そのため、まだその方法を使用している人もいます。

2つ目は、関数が作成されているという事実をより明確にしたいと思う人もいるため、ラムダという単語を見たいという人もいます。

ですから、選択はあなたが個人的に一番好きなものに帰着すると私は信じています。

于 2011-01-24T01:50:49.823 に答える
2

TLSを使用しているときに、ラムダ計算について少し読んでいます(SimonPeytonJonesによる「TheImplementationofFunctional ProgrammingLanguages」を読んでいます。無料のPDFオンライン)。したがって、これは単なる推測ですが、TLSの作成者は、あなたが本当にラムダを多用することを望んでいると思います。彼らは出てきてそれを言うことはありませんが、これはすべて適用されたラムダ計算の単なる演習であるというヒントがあります(TLSのp.107をチェックしてください)。だから多分彼らは言うことなく言っている、「あなたはラムダの抽象化をしている、私の友人!」

于 2012-05-15T16:34:51.080 に答える
1

Little Schemerは、擬似コードスキームを使用します(教育目的で簡略化するため、および実装に依存しないようにするため)。今日の標準スキームには、ラムダを暗黙的に呼び出すdefineの定義があります(http://www.cs.cmu.edu/Groups/AI/html/r4rs/r4rs_7.htmlを参照)。Little Schemerスキームは非常に単純であり、この代替形式は含まれていません。

于 2011-01-24T01:53:08.480 に答える