모나드가 어떻게 작동하는지 이해하려고합니다. 분명히 그것은 Cont
의 사촌이며 역 추적 검색에 사용될 수 있습니다. 내가 대신 Select
을 사용하려면이 솔루션을 적용하기 위해 사투를 벌인거야모나크를 풀기 위해 선택 모나드를 사용하는 방법은 무엇입니까?
-- 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]
:
나는의 n 여왕 문제에이 목록 기반 솔루션이있다.
Select
은 답변을 비교하는 데 사용되는 "평가 기능"을 통해 추상화 할 수 있습니다. 이 함수는 runSelect
으로 전달됩니다. 내 솔루션에서 safeDiag
같은 것을 평가 함수로 사용할 수 있다고 생각하지만 계산 방법을 Select
자체로 구성하는 방법이 있습니까?
또한 Select
모나드 만 사용하면 충분합니까? 아니면 목록에 트랜스포머 버전을 사용해야합니까?
'선택'모나드를 원하십니까? '선택 '에 대한 나의 이해는 가능한 해결책의 존재를 증명하려고 시도한다는 것입니다 (증거로서). 'Select'의 전형적인 예는 SAT 솔버입니다. 아마도 모나드보다 'SelectT'로 무언가를 강요 할 수는 있지만, 실제로 선택한 모나드를 실제로 사용하게 될 것이라고 확신합니다. – Alec
@Alec '선택'은 역 추적 검색에 좋았고 n-queens은 그 유형의 전형적 문제 였으므로 모나드의 좋은 유스 케이스라고 생각했습니다. – danidiaz
솔루션을 찾을 때까지 모든 솔루션을 찾아서 되돌아 오는 것과 백 트랙킹을 구분할 수 있습니다. 그런 다음 다시 한 번 전에 '선택'으로 만 연주 했으므로 진지하게 말하는 것은 사용하지 마십시오. – Alec