2012-01-30 22 views
3

これは私の以前の質問のフォローアップです:Why do we need nil?明らかに、適切なリストがほとんどの時間使用されています。しかし、不適切なリストの目的は何ですか?不適切なリストは何ですか?

+0

「あなたの_opinion_は何ですか?」あなたの質問にある危険な文章です。ご存じのように、スタックオーバーフローに関する意見はありませんが、事実のみです。求める意見はあなたの質問だけを閉じます。既に、それは4つの近い票を持っています。もう1回近く投票するとあなたの質問が閉鎖されます。 –

+0

質問を保存するには、質問を完全に書き換えます。私はそれがあなたと大丈夫だと思います。 –

+0

リマインダーと編集のおかげで、Chris。私はそれを認識しませんでした。さて、それでもまだ閉鎖されていますか? – day

答えて

4

いいえ、理由はありません。不適切なリストが本当にうまくいくのは、関連リストの構文の一部としてだけで、キーと値のペアのカスタム構文も優れています。あなたが不適切なリストを考えていると思うことがあるのは、結局はリストを取り込んだレコードタイプを使うほうが良いでしょう。リストではレコードの定義でLispリストを定義できますが(リストでは定義できません型がその言語の他のすべての型とは離れているデータ構造)。

すべてのタイプのデータを表すためのペアとリストの悪用は、私がと呼ぶのが好きです.Lispプログラマー病、それは多くのLisp主張者が主張する本当の残念です。私はあまりにも多くのことをその方法でクリーンアップしなければならなかった。

+1

sacundim、クリアしていただきありがとうございます。私はかなり長い間、このリストとレコードに困惑しています。私はそれについてもっと読んでみたいと思います。しかし、グーグルは有用な結果を返しません。あなたは何度もそのようなものを掃除したと言いましたので、それがどこかに存在すればもっと見たいと思います。ありがとう。 – day

6

大きな質問! (まあ、とにかくクリスの書き直しが好きです...)。私の経験上、不適切なリストの最も一般的な使い方は、軽量の2要素構造です。

「このように、2つの要素からなる構造体が必要です.Ou、「cons」を使うのはなぜですか?組み込みであり、組み込みの引用によって本当にうまくサポートされています。シンタックス。一体何、私はそれをやるでしょう。

特に、「assoc」などの組み込み演算は、不適切な2要素リストのリストが与えられていると仮定して実装されることがよくあります。

+0

+1すばらしい答え! (あなたの信頼の投票に感謝します:-)) –

4

不適切なリストの存在は、基本ビルディングブロックcons,carおよびcdrの存在の自然な結果です。これらの3つがあらゆる種類のより複雑なデータ型の基礎を形成するのは、Lispの中心です。どういうわけか、免責のために不適切なリストを選ぶことは、任意の制限を課すことを必要とするでしょう。

+1

いいえ、それはありません。実際には、Lispが動的に型定義されている(またはラムダ計算の観点から、型なしの)事実の成果物です。静的型付きLispの類義語はドット付きリストを持たない。なぜなら、 'cons'に対応する型が第二引数をリストに制限するからです。例えば、Haskellでは、 '::: a - > [a] - > [a]'( ':'演算子は 'a'と' a'のリストを取り、 'a ')。 –

+1

ねえ、私はあなたの両方に同意しない:)。 2番目の要素が適切なリストである場合にのみconsを使用できる動的型指定言語を作成するのは簡単です。たとえば、Racketの教授言語レベルを参照してください。これは、例えば、+演算子に関連するチェックのようなものです。+は文字列では機能せず、適用時にチェックされます。 –

1

「不適切なリスト」は、consを使用してビルドされたリスト以外のデータタイプの曖昧な用語です。

Johnが述べているように、ある例では、MLにタプルを使用するのと同じ方法でconsのペアを使用します。

もう1つの例はリストのバリエーションです。たとえば、次のようにストリームを定義することがあります。

;; A Stream-of-X is one of 
;; - null, ie '() 
;; - (cons X Stream-of-X) 
;; - a procedure taking no arguments and returning a Stream-of-X result 

;; nats-from : nat -> Stream-of-nat 
(define (nats-from n) 
    (cons n (lambda() (nats-from (+ n 1))))) 
関連する問題