2016-04-22 53 views
1

我正在嘗試使用Haskell 99 Questions來學習Elm。問題7你必須定義一個嵌套的列表結構。我試過這樣:(閱讀this有些爲主)在Elm中定義一個嵌套或遞歸列表結構

type NestedList a = Node a | List (NestedList a) 

myList : NestedList number 
myList = 
    [Node 1] 

但是我得到這個以下錯誤:

The type annotation is saying: 
    NestedList number 

But I am inferring that the definition has this type: 
    List (NestedList number) 

這是沒有道理給我。當然List (NestedList number)是匹配Node a | List (NestedList a)的第二面?

回答

6

問題#7,您需要使用內置的榆樹List類型的NestedList定義的一部分,但已經定義了你NestedList類型實際上的方式創建一個名爲List構造無意中隱藏了內置List型。我覺得這種類型的簽名其實就是想給你你以後:

type NestedList a = Node a | NestedList (List (NestedList a)) 

myList簽名現在應該改變,因爲它實際上應該返回NestedListList S:

myList : List (NestedList number) 
myList = 
    [Node 1] 

鑑於這個新定義,您可以實現#7所要求的嵌套問題。你可以像這樣定義更復雜的列表:

-- e.g. [1,2, [3, 4, [5]], 6] 
myListierList : List (NestedList number) 
myListierList = 
    [Node 1, Node 2, NestedList [Node 3, Node 4, NestedList [Node 5]], Node 6] 
+0

好的,所以在''NestedList''中定義''''時使用'List',而不是使用內建的名稱。作爲後續工作,我如何定義一個更復雜的結構,例如[1,2,[3,4,[5]],6]使用這個? –

+1

我已經更新了我的答案,以更充分地捕捉問題#7的精神,並且它包含了複雜的嵌套列表示例。 –

+0

太好了。我認爲需要一段時間才能沉浸在...因此,事物的NestedList或者是Node的事物,或者是NestedLists列表的NestedList!感謝您抽出時間 - 非常感謝。 –