Próbuję zrozumieć, jak działa monada Select
. Najwyraźniej jest to kuzyn Cont
i można go użyć do przeszukiwania wstecznego.Jak korzystać z Monady wybrać, aby rozwiązać n-queens?
mam ten list opartych na rozwiązanie problemu n-królowych:
-- All the ways of extracting an element from a list.
oneOf :: [Int] -> [(Int,[Int])]
oneOf [] = []
oneOf (x:xs) = (x,xs) : map (\(y,ys) -> (y,x:ys)) (oneOf xs)
-- Adding a new queen at col x, is it threathened diagonally by any of the
-- existing queens?
safeDiag :: Int -> [Int] -> Bool
safeDiag x xs = all (\(y,i) -> abs (x-y) /= i) (zip xs [1..])
nqueens :: Int -> [[Int]]
nqueens queenCount = go [] [1..queenCount]
where
-- cps = columsn of already positioned queens.
-- fps = columns that are still available
go :: [Int] -> [Int] -> [[Int]]
go cps [] = [cps]
go cps fps = [ps | (p,nfps) <- oneOf fps, ps <- go (p:cps) nfps, safeDiag p cps]
jestem stara się przystosować do korzystania z tego rozwiązania Select
zamiast.
Wygląda na to, że Select
pozwala na streszczenie "funkcji oceny", która służy do porównywania odpowiedzi. Ta funkcja jest przekazywana do runSelect
. Mam wrażenie, że coś takiego jak safeDiag
w moim rozwiązaniu może działać jako funkcja oceny, ale jak samemu ułożyć obliczenia Select
?
Czy wystarczy sama monada Select
, czy też muszę używać wersji transformatora na listach?
Czy na pewno chcesz monadę 'Select'? Moje rozumienie "Wyboru" polega na tym, że próbuje udowodnić istnienie możliwego rozwiązania (jako dowód świadka). Typowym przykładem 'Select' jest solver SAT. Prawdopodobnie możesz wymusić coś poprzez 'SelectT' nad monadą listy, ale jestem bardziej pewny, że naprawdę skorzystasz z wybranej monady. – Alec
@Alec Czytałem, że 'Select' było dobre do przeszukiwania wstecznego, a n-queens jest archetypowym problemem tego typu, więc założyłem, że był to dobry przypadek użycia dla monady. – danidiaz
Rozróżnienie może być między cofaniem, aby znaleźć wszystkie rozwiązania i wycofanie, dopóki nie znajdziesz rozwiązania. Potem znowu grałem tylko z 'Wybierz' raz, więc nie traktuj poważnie niczego, co powiem. – Alec