【问题标题】:Haskell Linked List Algebraic DatatypeHaskell 链表代数数据类型
【发布时间】:2014-05-18 21:26:23
【问题描述】:

我试图实现一个 Haskell 代数数据类型链表(或者更准确地说,可能是类似链表的东西,因为我不知道使用 Haskell 进行内存寻址的任何方法)以及用于相互转换的辅助函数Haskell 的 naive list type 并写了以下内容:

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

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

【问题讨论】:

  • 常规 Haskell 列表类型与您的类型一样可能是链表。
  • 我很确定是的。
  • Haskell 没有承诺任何关于代表的事情,所以我很谨慎。 :)

标签: haskell linked-list algebraic-data-types


【解决方案1】:

使其编译所需的最小更改是简单地在非空列表的模式中添加一些括号;例如

hlistToLinkedList (x:xs) = ...

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多