わかりました、タプルのリストが推移的であるかどうかを判断する関数を作成しようとしています。つまり、(x,y) と (y,z) がリストにある場合、(x,z) もリストに含まれます。
たとえば、[(1,2), (2,3), (1,3)]
推移的です。
さて、プロローグのバックグラウンドから来て、次のことは私にとって理にかなっています:
transitive xs = and [elem (x, z) xs | (x, y) <- xs , (y, z) <- xs ]
ただし、機能しません。「y」は期待どおりに単一の値を取得しないようですが、2番目のタプルになると「再割り当て」されます。代わりに、次を使用する必要があります。
transitive xs = and [elem (x, z) xs | (x, y1) <- xs , (y2, z) <- xs, y1 == y2 ]
これはなぜですか?最初の例でエラーが発生しないのはなぜですか? また、これは関数型プログラミング言語の「参照透過性」の原則に反しないのでしょうか?
「しかし、純粋な関数型および論理型言語では、変数は式にバインドされ、参照透過性の要件により、その存続期間全体で単一の値を保持します。」-ウィキペディア
ありがとう!