Haskellでは、リスト(または配列)の値とインデックスを使用する必要がある関数または式を使用するのが難しいと私は常に気付いていました。リスト要素とインデックスを一緒に使用する
私は... Nクイーン問題 hereで実験しながら、下に
validQueens x =
and [abs (x!!i - x!!j) /= j-i | i<-[0..length x - 2], j<-[i+1..length x - 1]]
をvalidQueens
を書いた私は、それはずさんな感じなど、インデックスを使用するためのすべてのプラスとマイナスを気にしませんでした。私は、次のを思い付いた:
enumerate
(不可欠な概念を借用することは必ずしも素晴らしいアイデアではないこと)に触発されて
enumerate x = zip [0..length x - 1] x
validQueens' :: [Int] -> Bool
validQueens' x = and [abs (snd j - snd i) /= fst j - fst i | i<-l, j<-l, fst j > fst i]
where l = enumerate x
。コンセプトは良く見えますが、snd
とfst
はまあまあです。それはまた、一見したところでは、時間と空間の両方においてコストがかかります。私はそれがもっと好きかどうか分からない。だから、要するに
、私は既製のものによると補数
- 反復処理には本当に満足していません
誰かが上記のいずれよりもエレガントなパターンを見つけましたか?そうでない場合は、上記の方法のいずれかが優れている理由がありますか?