Codewars (случайное тестирование Haskell QuickCheck)

У меня есть этот рабочий код в части случайного тестирования Ката:

it "handles randoms " $ 
      property $ \x y -> updateHealth x y == if y > x then 0 else x-y

Но я хотел, чтобы сигнатура функции использовала Num, но когда я это сделала, я получаю сообщение об ошибке, потому что (я полагаю) она не знает, как генерировать Nums (поскольку она не знает, какие Nums делать?). Я просто жестко установил тип Double в качестве обходного пути.

Однако есть ли способ использовать Quickcheck, когда ваша сигнатура функции использует Nums? Вы должны указать это специально для генерации случайного Int или Integer, Float или Double?


person Cliff Stamp    schedule 01.08.2018    source источник
comment
Num не является типом; это класс типов, то есть набор типов. Таким образом, вы должны указать конкретный тип для использования. Обойти это невозможно, потому что компилятор не может выбрать конкретный экземпляр Num для использования (в большинстве случаев; см.: ограничение мономорфизма)   -  person AJF    schedule 02.08.2018


Ответы (1)


Однако есть ли способ использовать Quickcheck, когда ваша сигнатура функции использует Nums? Вы должны указать это специально для генерации случайного Int или Integer, Float или Double?

Как утверждает @AJFarmar, Num - это класс типов (семейство типов), а не конкретный тип.

Вы МОЖЕТЕ использовать QuickCheck с такой функцией, как Num a => a -> a -> a, вам просто нужно специализировать тип с помощью аннотации. Вы можете либо аннотировать функцию updateHealth, либо аннотировать саму функцию свойства:

it "handles randoms " $ 
  property $ \x y -> (updateHealth :: Int -> Int -> Int) x y == if y > x then 0 else x-y

(or)

it "handles randoms " $ 
  property ((\x y -> updateHealth x y == if y > x then 0 else x-y) :: Int -> Int -> Bool)

Эти параметры предпочтительнее, чем изменение типа updateHealth при его определении; вы хотите, чтобы ваши функции оставались общими, поэтому при необходимости вы можете специализировать их на их сайтах вызова.

person Gabriel L.    schedule 28.08.2018