在Elm中定义嵌套或递归列表结构

Cha*_*gan 1 elm

我正在尝试使用Haskell 99问题来学习Elm .在问题7中,您必须定义嵌套列表结构.我试过这个:(基于阅读本文)

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

myList : NestedList number
myList =
  [Node 1]
Run Code Online (Sandbox Code Playgroud)

但是我得到以下错误:

The type annotation is saying:
  NestedList number

But I am inferring that the definition has this type:
  List (NestedList number)
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.肯定List (NestedList number)是第二面匹配Node a | List (NestedList a)

Cha*_*ert 6

问题#7要求您使用内置的Elm List类型作为NestedList定义的一部分,但是您定义NestedList类型的方式实际上会创建一个被List无意中隐藏内置List类型的构造函数.我认为这种类型的签名实际上会给你你想要的东西:

type NestedList a = Node a | NestedList (List (NestedList a))
Run Code Online (Sandbox Code Playgroud)

您的myList签名现在应该改变,因为它实际上应该返回ListNestedListS:

myList : List (NestedList number)
myList =
  [Node 1]  
Run Code Online (Sandbox Code Playgroud)

鉴于这个新定义,您可以实现#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]
Run Code Online (Sandbox Code Playgroud)