Я ненавижу идею разработки Windows, но VC ++ отладчик среди лучшего, которое я видел. Я не нашел фронтэнд GUI, который близко подходит к VC один.
GDB является потрясающим, после того как Вы действительно привыкаете к нему. Используйте его в гневе достаточно, и Вы станете очень опытными. Я могу свистеть вокруг программы, делающей все вещи, которые Вы перечисляли без особых усилий больше. Действительно требовался приблизительно один месяц страдания по ссылке SSH на удаленный сервер, прежде чем я был опытным. Я никогда не возвращался бы все же.
DDD действительно мощен, но это было довольно ошибочно. Я нашел, что это замерзло довольно часто, когда это получило сообщения от GDB, что это не сделало grok. Это хорошо, потому что это имеет окно интерфейса gdb, таким образом, Вы видите то, что продолжается, и также взаимодействуйте с gdb непосредственно. DDD не может использоваться на удаленном X сессий в моей среде (настоящая проблема, так как я сижу в тонком клиенте, когда я делаю Unix dev), по некоторым причинам, таким образом, это отсутствует для меня.
KDevelop следовал за типичным стилем KDE и выставил ВСЕ пользователю. У меня также никогда не было удачи при отладке не программ KDevelop в KDevelop.
Комар программируя Studio (GPS) является на самом деле вполне хорошим фронтендом к GDB. Это только управляет проектами Ada, таким образом, это стоит испытать, если Вы нуждаетесь в отладчике.
Вы могли использовать Eclipse, но это - довольно тяжелый вес и много закаленных людей Unix, с которыми я работал (меня включенный), не заботятся очень о его интерфейсе, который не будет просто STFU и выходить из Вашего пути. Eclipse также, кажется, поднимает много пространства и работает как собака.
Я хотел сказать, что у вас путаница типов. А именно, aBlank
- это не Pos
, а Gen Pos
, поэтому обновление su aBlank aCandidate
не имеет смысла! Фактически, вам нужен способ сгенерировать новую судоку с учетом исходной судоку; другими словами, функцию
similarSudoku :: Sudoku -> Gen Sudoku
Теперь мы можем написать ее:
similarSudoku su = do aBlank <- elements (blanks su)
-- simpler than oneOf [return x | x <- blanks su]
aCandidate <- elements (candidates su aBlank)
return (update su aBlank aCandidate)
или даже проще:
similarSudoku su = liftM2 (update su) (elements (blanks su)) (elements (candidates su aBlank))
И свойство выглядит как
prop_similar :: Sudoku -> Gen Bool
prop_similar su = do newSu <- similarSudoku su
return (isSudoku newSu && isOkay newSu)
Поскольку есть экземпляры
Testable Bool
Testable prop => Testable (Gen prop)
(Arbitrary a, Show a, Testable prop) => Testable (a -> prop)
Sudoku -> Gen Bool
, это ] Также можно тестировать
(при условии экземпляра Произвольный судоку
).
кажется, что aBlank :: Gen Pos
, который не соответствует тому, как он используется в качестве аргумента для кандидатов :: Sudoku -> Pos -> [ Int]
.
Я просматривал здесь , чтобы найти способ преобразовать Gen a
в a
, который позволил бы вам использовать это с кандидатами. Лучшее, что я смог увидеть, это функция сгенерировать
.
Скажите мне, если я что-то упускаю ...
В своем блоге я написал простой симулятор игры в кости с тестами QuickCheck, которые используют oneof
для создания интересных бросков.
Допустим, у нас есть супер-простая судоку из одной строки:
module Main where
import Control.Monad
import Data.List
import Test.QuickCheck
import Debug.Trace
type Pos = Int
data Sudoku = Sudoku [Char] deriving (Show)
Ни одна супер-простая судоку не должна иметь повторяющихся значений:
prop_noRepeats :: Sudoku -> Bool
prop_noRepeats s@(Sudoku xs) =
trace (show s) $ all ((==1) . length) $
filter ((/='.') . head) $
group $ sort xs
Вы можете сгенерировать супер-простую судоку с помощью
instance Arbitrary Sudoku where
arbitrary = sized board :: Gen Sudoku
where board :: Int -> Gen Sudoku
board 0 = Sudoku `liftM` shuffle values
board n | n > 6 = resize 6 arbitrary
| otherwise =
do xs <- shuffle values
let removed = take n xs
dots = take n $ repeat '.'
remain = values \\ removed
ys <- shuffle $ dots ++ remain
return $ Sudoku ys
values = ['1' .. '9']
shuffle :: (Eq a) => [a] -> Gen [a]
shuffle [] = return []
shuffle xs = do x <- oneof $ map return xs
ys <- shuffle $ delete x xs
return (x:ys)
Трасса
предназначена для отображения произвольно сгенерированные платы:
*Main> quickCheck prop_noRepeats
Sudoku "629387451"
Sudoku "91.235786"
Sudoku "1423.6.95"
Sudoku "613.4..87"
Sudoku "6..5..894"
Sudoku "7.2..49.."
Sudoku "24....1.."
[...]
+++ OK, passed 100 tests.