#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
, хотя вы собираетесь использовать только одно из них. Лучше сначала решить, что именно, а затем сгенерировать именно это.