Правильное использование чекера для аппликативного

#haskell

Вопрос:

У меня есть следующая прикладная реализация (это классическая проверка)

 module Validation where  import Test.QuickCheck (Arbitrary (arbitrary), frequency) import Test.QuickCheck.Checkers (EqProp ((=-=)), eq, quickBatch) import Test.QuickCheck.Classes (applicative)  data Validation e a =  Failure e  | Success a  deriving (Eq, Show)  instance Functor (Validation e) where  fmap f (Success a) = Success (f a)  fmap _ (Failure e) = Failure e  instance (Arbitrary e, Arbitrary a) =gt; Arbitrary (Validation e a) where  arbitrary = do  e lt;- arbitrary  b lt;- arbitrary  frequency [(1, return (Failure e))  , (1, return (Success b))]  instance (Eq e, Eq a) =gt; EqProp (Validation e a) where  (=-=) = eq  instance Monoid e =gt; Applicative (Validation e) where  pure = Success  (lt;*gt;) (Success f) (Success x) = Success (f x)  (lt;*gt;) (Success _) (Failure y) = Failure y  (lt;*gt;) (Failure x) (Success _) = Failure x  (lt;*gt;) (Failure x) (Failure y) = Failure (x lt;gt; y)  

Попытка проверить прикладную реализацию с помощью шашек

Моя попытка до сих пор

 type ValidationTyped = (Validation String Int) trigger :: ValidationTyped trigger = undefined  main :: IO () main = do  quickBatch $ applicative trigger  

Но это не работает, так как он не будет компилироваться, есть какие-нибудь предложения?

Редактировать:

Сообщение об ошибке

 • Couldn't match type ‘Int’ with ‘(a0, b0, c0)’  Expected type: Validation String (a0, b0, c0)  Actual type: ValidationTyped • In the first argument of ‘applicative’, namely ‘trigger’  In the second argument of ‘($)’, namely ‘applicative trigger’  In a stmt of a 'do' block: quickBatch $ applicative   

Комментарии:

1. вы ищете это: ` quickBatch $ аппликативный (неопределенный :: Строка проверки (Строка, строка, строка))` в вашем man , я думаю.

2. @user1984 Вы правы, я заменил type ValidationTyped = (Validation String (String, String, Int)) , и это сработало, пожалуйста, подробно объясните, почему, чтобы я мог отметить соответствующим образом.

3. Ваш Arbitrary экземпляр, похоже, выполняет немного больше работы, чем необходимо, производя случайные вещи, которые он в конечном итоге выбрасывает. Это также сложнее, чем должно быть. Я предлагаю arbitrary = frequency [(1, Failure lt;$gt; arbitrary), (1, Success lt;$gt; arbitrary)] .

4. @dfeuer Я понимаю сложную часть и то, как ее можно упростить, но я не понимаю, что вы подразумеваете под producing things tat it ends up throwing away

5. @calin, ваш должен сгенерировать случайное число для создания e и другое для создания b , хотя вы собираетесь использовать только одно из них. Лучше сначала решить, что именно, а затем сгенерировать именно это.