2016-08-14 6 views
0

Iは、データタイプを有する:ドメイン構造ハスケル

data Tree e = Node e (Tree e) (Tree e) | Empty deriving (Show) 

type Forest e = [Tree e] 

data Animal = Squirrel | None deriving (Show) 

および森のIntのグラフィカル表現である:

enter image description here

最後の要素は、底部です。それから、最後の2行目は空にすることができます。しかし、私は⊥:⊥の意味を理解していませんでした。それはリストのコンストラクタですか?このように5:[]? 3列目でに[]がない理由

誰でも私が間違って理解していることを教えてください。 ありがとうございます。

答えて

1

はい、_|_ : _|_はリスト:のコンストラクタです。定義されていないリスト要素と未定義のリストテールに適用されます。同様に、Empty : _|_

let list = list 
in Empty : list 

に関連付けられた値であるリストの末尾が収束(終了に失敗したので、これはここには[]はHaskellのプログラムに関連するインスタンスの値、

let list = list 
    elem = elem 
in elem : list 

ありますされていません)が無限に再帰するため、その値は未定義です(_|_)。ドメインの順序で

は、我々は増加するシーケンス

_|_ 
Empty : _|_ 
Empty : Empty : _|_ 
Empty : Empty : Empty : _|_ 
... 

リミット(AKAのLUBまたはsupremum)永遠Emptyを繰り返す無限のリストを持っています。

_|_ : _|_ : _|_ 

比較により

let list = list 
    elem = elem 
in elem : elem : list 

に関連したものである、

_|_ : _|_ : [] 

let elem = elem 
in elem : elem : [] 
の値です。

リストには明確な終わりがあるので、上記で長さを計算できることに注意してください。 lengthを使用すると、リスト要素を評価する必要がないため、2が生成されるため、下限は強制されません。

+0

と_ _ _の場合はどうなりますか(_ | _:_ | _)。 3行目、最初の要素は右からですか? –

+0

上記の編集をご覧ください。 – chi

+0

つまり、リストに2つの要素があり、どちらも定義されておらず、[]も未定義ですか? –

関連する問題