9

プロローグでは、次のようなことができます。

myFunction a (a:xs) = ...

つまりmyFunction、の最初の引数が2番目の引数にあるリストの最初の項目と同じである場合、この関数はに評価され...ます。

私の質問は...Haskellで同様のことをどのように達成するかです。私は、PrologのパターンマッチングがHaskellのパターンマッチングよりも表現力に富んでいると考えています。私はHaskellでそれをコーディングしようとしていて、問題が発生しています-無効な構文を使用しているか、上記のトリックではうまくいきません。

4

3 に答える 3

13

Haskellはこの種の「変数マッチング」を行いません。以下に明示的に警戒する必要があります。

myFunction a (x:xs)
    | x == a = ...
于 2010-11-04T00:39:46.223 に答える
12

Haskellは、Prologのように、変数の統合を行いません。Haskell 98レポートが言うように、

各一致に対応するパターンのセットは線形である必要があります---セット全体で変数を複数回表示することはできません。

もちろん、変数に名前を付けて、それらも等しくなければならないことを述べることができます。

f a (b:_) | a == b = ...

興味深いことに、Agdaはこのようなパターン間で情報を流し、f x (.x:_)これはそれでxなければならないという特別な表記法を導入していxます。

于 2011-05-07T03:00:19.850 に答える
8

Haskellでは、パターンマッチでこのような暗黙の比較を行うことはできません。代わりに、次のように、比較を明示的に行うガードを追加する必要があります。

myFunction a (b:xs) | a == b = ...
于 2010-11-04T00:39:52.577 に答える