1

解析エラーは、現在、私が最も嫌いなタイプの Haskell エラーです。したがって、2 番目のコンポーネントにいくつかの変数が含まれるペアのリストを取得する関数を作成しています (これは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です。また、名前xsを隠しているため、コードを追跡するのが難しくなっています。あなたはおそらく次のようなものが欲しい

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

が括弧のペア内にあるため、解析エラーが発生してい|ます。構文的に有効であるためには、リスト内包表記の角括弧内に直接配置する必要があります。

それを修正した後、型シグネチャは関数が を受け取ることを示しているため、型エラーが発生しますがSubst a、引数をリストのように扱っています。

varsまた、実際には適切なタイプの関数が存在しないため、関数で問題が発生するのではないかと思いますa -> [String](「適切な」とは、すべての引数に対して同じ文字列のリストを返すだけではないことを意味します)。

于 2012-11-09T20:50:55.413 に答える