list - Haskell : Parse error in case statement (involving lists!)

标签 list parsing haskell compiler-errors tree

我在case语句中遇到了(我假设)正在使用的类型(用于霍夫曼编码的分配)的麻烦。我想从树的顶部一直到每个叶子,并返回键值对的列表。 []正常,但[h]返回解析错误,我不确定为什么。

type HCode = [Bit]
data Bit = L | R deriving (Eq, Show)
data Tree a = Leaf Int a | Node Int (Tree a) (Tree a) deriving (Eq)

convert :: Ord a => HCode -> Tree a -> [(a,HCode)]
convert hs tree =
  case hs tree of
    []     (Node _ a b) -> (convert [L]            a)++(convert [R]            b)
    [h]    (Node _ a b) -> (convert !([h]++[L])    a)++(convert !([h]++[R])    b)
    (h:hs) (Node _ a b) -> (convert !((h:hs)++[L]) a)++(convert !((h:hs)++[R]) b)
    [h]    (Leaf _ a)   -> [(a, [h])]
    (h:hs) (Leaf _ a)   -> [(a, (h:hs))]

我以前也没用过刘海,但我觉得这里合适吗?它们会对性能产生影响吗?我什至在正确的环境中使用它们吗?

最佳答案

case a b of ...不能同时匹配ab,而是匹配使用参数a调用b作为函数的结果。 case表达式始终与一个值完全匹配,甚至第一个子句(您认为有效)也绝对不起作用。

要与两个值匹配,可以将它们包装在一个元组中,然后在每个子句中将其拆分,如下所示:

case (hs, tree) of
  ([], (Node _ a b)) -> ...
  ([h], (Node _ a b)) -> ...
  ...

关于list - Haskell : Parse error in case statement (involving lists!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43752251/

相关文章:

algorithm - 带着购物 list 逛超市,最快买到所有商品?

haskell - 基于两个不同仿函数的应用类型类

python - 无法从文件中逐行列出?

c - C 有像 Java 那样的垃圾收集器吗?

java - 需要帮助解析 Java 中的字符串

Java xml 解析。通过一个函数调用深入浏览 xml 文件

json - 如何在 Haskell 中解析 exiftool JSON 输出的示例

haskell - 过滤器将元数据添加到 pandoc

python : Print list of list as tables

vb.net - VB.NET 中的 NDESK 命令行解析