カード

このあいだのあれ、さくっと2行削れるなあ。
http://d.hatena.ne.jp/nuc/20050831/p4
http://d.hatena.ne.jp/nuc/20050902/p1
最後の一行は番兵で念のためいるだけ。

gen :: (Int, Int, Int) -> [Int] -> [([Int], [Int], [Int])]
gen (0,0,0) _ = [([ ],[ ],[ ])]
gen (a,b,c) _ | a < 0 || b < 0 || c < 0 = [ ]
gen (a,b,c) (x:xs)=    (map (\(as,bs,cs) -> ((x:as),bs,cs)) (gen (a-1,b,c) xs))
                    ++ (map (\(as,bs,cs) -> (as,(x:bs),cs)) (gen (a,b-1,c) xs))
                    ++ (map (\(as,bs,cs) -> (as,bs,(x:cs))) (gen (a,b,c-1) xs))
gen _ _ = []

filter (\(a,b,c) -> sum b == sum c && product a == product b )$ gen (4,4,4) [1..12]
で実行。
思うに、こんな単純なことに気がつかなかったのは、[([ ],[ ],[ ])] と [ ] が異なるということがすっきりわかっていないからではないだろうか。

あと、tuple を (,) ふたつのカテゴリから直積を作るものとみなすと、(f, g) (a, b) = (f a, g b) であるべきな気がする。
関数適用を何かのクラスの要素にすべきかもしれない。あ〜、言語的にはだめなのか。

それはそうと、はてなアドホックというかその場しのぎというか何も考えていないというか、…っていうかおまえ全射じゃないだろ…、みたいな wiki風入力書き換えルール困りますよ。とりあえず、少なくとも、全射にしてください。