2016-04-22 51 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!感谢您抽出时间 - 非常感谢。 –