Почему появляется сообщение «Нет экземпляра для (Произвольного), возникающего в результате использования« quickCheck »»? - PullRequest
0 голосов
/ 22 октября 2018

Я новичок в Haskell и у меня возникли проблемы с этой ошибкой.Я использую GHCI на Windows.Это код:

data Direction = North | South | East | West
            deriving (Eq, Show)
type Point = (Int, Int)
origin = (0,0)
type Road = [Direction]
movement :: Point -> Road -> Point
{- ... }
test :: Road -> Road -> Bool
test road1 road2 = movement origin road1 == movement origin road2
-- i check if two roads lead to the same destination starting from 
-- the origin point in a grid

Вот что происходит, когда я пытаюсь запустить тест:

*Main> quickCheck test
<interactive>:8:1: error:
* No instance for (Arbitrary Direction)
    arising from a use of `quickCheck'
* In the expression: quickCheck test
  In an equation for `it': it = quickCheck test

Мой учитель сказал мне, что мой код правильный, но не объяснил, почему этопроисходит в Windows, таким образом, при условии отсутствия решения.Также я не нашел ничего полезного в Интернете.Я действительно ценю объяснение.

1 Ответ

0 голосов
/ 22 октября 2018

Вы определили:

Direction = North | South | East | West
        deriving (Eq, Show)

В приведенном выше нет instance Arbitrary Direction.В конце концов, как это могло быть?Вы только что определили направление, и единственными экземплярами во всем мире являются Eq и Show.

Попробуйте:

import Test.QuickCheck
data Direction = North | South | East | West
   deriving (Eq,Show)

instance Arbitrary Direction where
    arbitrary = elements [North,South,East,West]

Функция elements происходит от Test.QuickCheck простокак Arbitrary.

В качестве мета-примечания: Если ваш преподаватель не сразу увидел проблему здесь, то произошла ошибка или вы должны планировать дополнить свое обучение на Haskell, например, используя онлайн-ресурсы, такие как вики-книги,печатные материалы, такие как «Ремесло функционального программирования», или множество разговоров в таких местах, как freenode.

...