Как использовать 'oneof' в quickCheck (Haskell)

Я ненавижу идею разработки 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 также, кажется, поднимает много пространства и работает как собака.

5
задан Mickel 1 December 2009 в 22:08
поделиться

3 ответа

Я хотел сказать, что у вас путаница типов. А именно, 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 , это ] Также можно тестировать (при условии экземпляра Произвольный судоку ).

5
ответ дан 14 December 2019 в 04:40
поделиться

кажется, что aBlank :: Gen Pos , который не соответствует тому, как он используется в качестве аргумента для кандидатов :: Sudoku -> Pos -> [ Int] .

Я просматривал здесь , чтобы найти способ преобразовать Gen a в a , который позволил бы вам использовать это с кандидатами. Лучшее, что я смог увидеть, это функция сгенерировать .

Скажите мне, если я что-то упускаю ...

1
ответ дан 14 December 2019 в 04:40
поделиться

В своем блоге я написал простой симулятор игры в кости с тестами 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.
2
ответ дан 14 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: