私はハスケルにとって非常に新しく、代数的グループでいくつかのことをしようとしています。私の最初の機能は、操作とセットを受け取り、同じセットのメンバーのペアでその操作を実行することによって生成できるセットのすべてのメンバーを見つけることです。これは、このために私のコードです:ハスケルリストの理解述語の順序
group' f xs = [a | a <- xs, a <- combSet]
where combSet = [f x y | x <- xs, y <- xs]
しかし、このコードは、単にa <- xs
述語を無視し、combSetのメンバーのセットを返します。
*Main> group' (*) [1, 2, 3, 4, 5]
[1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25]
をしかし、私は理解述語の順序を切り替えたときに、
group' f xs = [a | a <- combSet, a <- xs]
where combSet = [f x y | x <- xs, y <- xs]
には、正しい値を返しますが、リストが予想以上に道大きいです:
*Main> group' (*) [1, 2, 3, 4, 5]
[1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]
誰が私にこのようなことが起こったのか、私が何か愚かなことをしたことを教えてもらえますか?
ああ、説明をありがとう。私は数学的なバックグラウンドを持ち、思考リストの解説はセットの定義と同じでした。 – user2461616