1

解析错误是目前我最不喜欢的 Haskell 错误类型。所以我正在编写一个函数,在其中我得到一个对列表,其中第二个组件包含一些变量(这取决于vars我之前在我的代码中定义为vars :: a -> [String]。如果列表为空,则没有任何自由变量,并且替换被认为已解决。

我已经这样做了,但我得到了一个parse error on '|'

solved :: Subst a -> Bool
solved xs = null [(S(xs,d) | (S(xs,d)) <- xs, not (null (vars d)))]

我之前将我的数据类型定义为

data Subst a = S [(String,a)]

我鄙视解析错误,因为要花很长时间才能找出问题所在(笑)。任何人的任何想法?

4

2 回答 2

1

solved xs = null [(S(xs,d) | (S(xs,d)) <- xs, not (null (vars d)))]
                         ^^

缺少右括号。

但是,看起来你还有更多问题,

data Subst a = S [(String,a)]

solved :: Subst a -> Bool
solved xs = null [(S(xs,d) | (S(xs,d)) <- xs, not (null (vars d)))]

xs不是 中的列表pattern <- xs,而是Subst a. 此外,您还隐藏了 name xs,这使得代码难以遵循。你可能想要类似的东西

solved (S xs) = null [ () | (varname, d) <- xs, not (null $ vars d) ]
于 2012-11-09T20:50:14.763 回答
1

您会收到解析错误,因为|它位于一对括号内 - 它需要直接位于列表推导的方括号内才能在语法上有效。

修复该问题后,您将收到类型错误,因为您的类型签名表明您的函数采用 a Subst a,但您将参数视为列表。

我还怀疑你的vars函数会遇到问题,因为实际上不可能有一个明智的类型函数a -> [String](这里的“明智”是指一个不只是为每个参数返回相同的字符串列表的函数)。

于 2012-11-09T20:50:55.413 回答