2016-04-29 20 views
4

私はフェニックスがテンプレートをヨードアタとしてレンダリングする方法を掘り下げています。私には奇妙に見えるリストがいくつか見つかりました。 "垂直バー"または "垂直パイプ"文字(|)を含むリストの構文の基本ビットが欠落しているようです。ここでエリクシール:これはどのような種類のリストですか?

私はを行ういくつかの例が理解されています

# prepends 1 to the list [2, 3] 
l = [1 | [2, 3]] #=> [1, 2, 3] 

# matches the head and tail into variables 
inspect_tail = fn ([_head | tail]) -> IO.inspect(tail) end 

私が得るものを。しかしこれは何ですか

l = ["hi" | "there"] #=> ["hi" | "there"] 

頭と尾を持つリストであるように思わ:

is_list(["hi" | "there"]) #=> true 
hd(["hi" | "there"])  #=> "hi" 
tl(["hi" | "there"])  #=> "there" 

...しかし、このようなリストを与えられた場合length(list)機能はArgumentErrorを与えます。

これは何ですか、それは何のために使用されていますか?

+0

グーグルでは、これが「不適切なリスト」になるかもしれないと思うようになります。そうですか? –

+1

まだユースケースを理解しようとしています。 [this article](http://www.evanmiller.org/elixir-ram-and-the-template-of-doom.html)が示すように、 ':re.replace'(' Regex.replace'と違って)は、不適切なリスト: 're.replace(" sing "、" i "、" o ")#> [" s "、" o "、| "ng"] '。私はそれが既存の文字列を再利用していることを知っていますが、なぜ結果が '[" s "、" o "、" ng "]ではないのか分かりません。 –

答えて

5

不適切なリストが正しいです。

私はLearn You Some Erlangからの注釈を引用しますが、これはうまくまとめています。

注:フォーム[1 | 2]を使用すると、「不適切なリスト」と呼ばれるものがあります。不適切なリストは、[Head|Tail]の方法でパターンマッチングを行うと機能しますが、Erlangの標準関数(偶数length())には使用できません。これはErlangが適切なリストを期待しているからです。適切なリストは最後のセルとして空のリストで終わります。 [2]のような項目を宣言すると、リストは自動的に適切な方法で形成されます。したがって、[1|[2]]が機能します。不適切なリストは、構文的には有効ですが、ユーザー定義のデータ構造の外部では使用が非常に限られています。

2

これは実際に不適切なリストです。これは、適切なリストとは異なり、それ自体がリストであるヘッド要素とテールを持ちますが、不適切なリストはnot-a-listで終わります最後の要素はコンスセルでもなくてもかまいません。 (コンサルト/無言で混乱しているのですか?末尾を参照してください)

the inspect tests for an improper list hereを実際に見てみることができます。

like hd/1,には、maybe_improper_listという引数型がありますが、それ以外の場合はlike length/1,が適切なリストのみを想定しています。


Lispの背景がない場合、そのコンスセル/ nilビットが混乱する可能性があります。

"Nil"は基本的に "空のリスト"ですが、これは、リストが何であるかの循環定義につながります。 "リストは、それ自体がリストであるテールに結びついたヘッド要素です。ロールリスト: "

nilを独自の特殊なものとして区別することによって、"私は、 Nilはリストであり、一つの要素をリストに収めて別のリストを構築することができます。これはそこでまともな誘導データ型の定義です。:)

関連する問題