Класс типа Haskell "Ошибка разбора на входном экземпляре" - PullRequest
0 голосов
/ 07 декабря 2018

Я работаю над домашним заданием и мне нужна помощь. Задача: На первом шаге мне нужно определить новый класс типов для перегруженной функции "genDrop".Он должен вести себя как «drop» (для Int), но не ограничиваться Int.На втором шаге он должен быть создан для типов Int, Nat, PosNat и Int '.

Так вот мой код:

class GenDrop a where
     genDrop :: a -> [a] -> [a]


    instance GenDrop Int where
        genDrop 0 s = s
        genDrop n (_:s) | n>0 = genDrop (n-1) s
        genDrop _ [] = []

    instance GenDrop Nat where
        genDrop Zero s = s
        genDrop (Succ n) (_:s)  = genDrop n s
        genDrop _ [] = []

    instance GenDrop PosNat where
        genDrop One (_:s)= s
        genDrop (Succ' n) (_:s) = genDrop n s
        genDrop _ [] = []

    instance GenDrop Int' where
        genDrop Zero' s = s
        genDrop (Plus n) (_:s) = genDrop n s
        genDrop (Minus n) s = s
        genDrop _ [] = []

Но при компиляции я получаю ошибку:

ошибка разбора на входе 'instance'
instance GenDrop Int, где

Я не могу понять, что не так.

1 Ответ

0 голосов
/ 07 декабря 2018

Объявления instance не являются частью объявления class: не делайте отступы, как если бы они были.Отступы имеют значение в Haskell.

Вот исправленный код:

class GenDrop a where
    genDrop :: a -> [a] -> [a]

instance GenDrop Int where
    genDrop 0 s = s
    genDrop n (_:s) | n>0 = genDrop (n-1) s
    genDrop _ [] = []

instance GenDrop Nat where
    genDrop Zero s = s
    genDrop (Succ n) (_:s)  = genDrop n s
    genDrop _ [] = []

instance GenDrop PosNat where
    genDrop One (_:s)= s
    genDrop (Succ' n) (_:s) = genDrop n s
    genDrop _ [] = []

instance GenDrop Int' where
    genDrop Zero' s = s
    genDrop (Plus n) (_:s) = genDrop n s
    genDrop (Minus n) s = s
    genDrop _ [] = []
...