Haskell链表代数数据类型

Haskell链表代数数据类型,haskell,linked-list,algebraic-data-types,Haskell,Linked List,Algebraic Data Types,我试图实现一个Haskell代数数据类型链表(或者更准确地说是类似链表的东西,因为我不知道使用Haskell进行内存寻址的任何方法)以及用于转换Haskell原始列表类型的帮助函数,并编写了以下代码: data LinkedList a = Nill | Node a (LinkedList a) deriving Show hlistTolinkedList :: [a] -> LinkedList a hlistToLinkedList [] = Nill hlistToLinked

我试图实现一个Haskell代数数据类型链表(或者更准确地说是类似链表的东西,因为我不知道使用Haskell进行内存寻址的任何方法)以及用于转换Haskell原始列表类型的帮助函数,并编写了以下代码:

data LinkedList a = Nill | Node a (LinkedList a) deriving Show

hlistTolinkedList :: [a] -> LinkedList a
hlistToLinkedList [] = Nill
hlistToLinkedList x:[] = Node x Nill
hlistToLinkedList x:xs = Node (x) (stringToLinkedList xs)

linkedListToHlist :: LinkedList Char -> [Char]
linkedListToHlist (Node a b) = a ++ linkedListToString b
linkedListToHlist Nill = ''
我发现以下编译器错误:

@5:1-5:21 Parse error in pattern: hlistToLinkedList

我不确定我的功能出了什么问题。有人能解释一下吗?

编译所需的最小更改是在非空列表的模式中添加一些括号;e、 g

hlistToLinkedList (x:xs) = ...

通过要求复杂模式使用括号,编译器不需要知道每个构造函数接受多少个参数;减少上下文敏感度和促进单独编译的一个重要技巧。

Daniel是对的,但我认为列表中只有on元素应该是:

hlistToLinkedList [x] = Node x Nill
为什么不为hlistToLinkedList创建递归呢?我想

hlistToLinkedList (x:xs) = Node x (hlistToLinkedList xs)
这样做会更好:)

另一点是,最好使用cons运算符而不是串联,因为在大多数情况下,++的效率为n^2,并且:仅为n

linkedListToHlist (Node a b) = a : linkedListToString b

常规的Haskell列表类型与您的类型一样可能是一个链接列表。我很确定它是。Haskell不承诺任何表示形式,所以我很谨慎。:)