我试图实现一个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
我不确定我的功能有什么问题。有人请解释一下吗?
答案 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