2016-04-17 32 views
3

ネストされたリストの頭と尾を取得します。私はNestedListの頭と尾を取得しようとしていますが、私はそれができるかどうかはわかりません私はそのように宣言ネストされたリストの種類持って

data NestedList a 
= Int a 
| List [NestedList a] 
deriving (Show, Eq) 

を達成された。私の試みは、NestedListの最初のIntを取得するので、本当に成功しませんでした。私のコードは:

headList :: NestedList a -> NestedList a 
headList (Int x) = Int x 
headList (List x) = head $ map headList x 

私はすべてのリストを繰り返し、それぞれからIntを取得するため、これが機能しない理由を理解しています。だから、例えば:

test = List [List [Int 5]] -> headList test = Int 5, instead of List [Int 5] 

私は尾のための解決策は、(リストの代わりに、要素の一部を除いて)同様であろうと思いますので、誰も私には、少なくとも作業headListを得るのを助けることができますか? a秒の

+0

この宿題はありますか?私にとって、あなたはすでにあなたが最初にやっていることを知らないほど多くを推測しているようです。頭と尾はどういう意味ですか?あなたはリストが何であるか知っていますか?またはInt? (あなたはIntとListの名前をFooとBarに置き換えることができますが、それでも同じことが起こり、混乱は少なくなります) – comonad

+0

「あなたの頭と尾はどういう意味ですか?私は最初の要素を返すことを意味するラケットのcarとcdrのようなものを作ることを目指しています。 - cdrのために - 最初の要素以外のすべてのリスト。 – Xzenon

+0

私の回答に追加するには、これは宿題ではありません。利用可能なドキュメントの多くを理解していないので、私は他のSOの投稿で見つかったものに基づいて推測しています - "haskell "10ページの平坦化リスト(headList関数のベースとして使用しようとしたもので、明らかに動作しなかったものです)が表示されます。 – Xzenon

答えて

2

NestedListIntでマークaの原子、(の代わりにAを使用してみましょう)またはa S(のは、そのためのNを使用してみましょう)のネストされたリストです:何、そう

data NestedList a = A a | N [NestedList a] 
     deriving (Show, Eq) 

空リスト? - それはN[ ]です。頭や尾はありません。

シングルトンリストとは何ですか? - A xまたはN[A x]の場合、その頭はちょうどxです。

シングルトンリストの末尾は何ですか? - それは空リストです。

長いリストの末尾は何ですかN(h:t)? - hA _の場合はN tです。

ネストされた構造が多い他のケースは、より複雑です。その場合はheadが一番左の原子を返すようにし、tailを入れて、一番左の要素を持たない同様にネストされた構造を構築しますか?これは再帰的に行うことができます:

headNested (A x) = x 
headNested (N xs) = headNested (head xs) 

右でしょうか?コメントではuser Bergiが指摘しているように単純ではありません。ネストされた空のリストの場合はどうでしょうかN[ N[ ], N[ ]]?あまりにも空であると考えられるのでしょうか? (おそらくそうだ)。だからこれはもっと関与しなければならないでしょう。おそらく、いくつかの種類の標準構造を決定し、最初に使用されるnormalizeルーチンを実装したいと思うでしょう。

いっそあるとして、構造を維持し、代わりに、頭と尾のMaybeペアを返すに切り替え、the other advice in the commentsに従い、再帰的にことを使用しています。

+1

また、 'N [N []、N []]'の場合を考えてみましょう。 – Bergi

関連する問題