Haskell链表清单代数数据类型

时间:2014-05-18 21:26:24

标签: 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
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

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

2 个答案:

答案 0 :(得分:7)

进行编译所需的最小更改是简单地为非空列表的模式添加一些括号; e.g。

hlistToLinkedList (x:xs) = ...

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

答案 1 :(得分:1)

丹尼尔是对的,但我认为,只有元素的列表应该是:

hlistToLinkedList [x] = Node x Nill

为什么你不为hlistToLinkedList递归?我想

hlistToLinkedList (x:xs) = Node x (hlistToLinkedList xs)

这是更好的方法:)

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

linkedListToHlist (Node a b) = a : linkedListToString b