Class Haskell类型类“;输入实例上的分析错误";

Class Haskell类型类“;输入实例上的分析错误";,class,haskell,typeclass,Class,Haskell,Typeclass,我正在做作业,需要一些帮助 任务: 在第一步中,我需要为重载函数“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”定义一个新的类型类。它的行为应该类似于“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 _ [] = []
但在编译时,我遇到了一个错误:

输入“实例”上的分析错误
实例GenDrop 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 _ [] = []

实例
声明不是
声明的一部分:不要将它们缩进,就好像它们是。缩进在哈斯克尔很重要

以下是更正后的代码:

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 _ [] = []

这可能无关紧要,但这里的定义是:data Nat=Zero | such Nat data PosNat=One | such'PosNat data Int'=Zero'|加上PosNat |减去PosNat这里的缩进是否与代码中的缩进相同?您需要将
实例
定义移到
声明之外。您需要缩进实例,以便单词
实例
与单词
在同一列开始,即在行的最开头。太好了!就这样!这几乎把我逼疯了。谢谢这可能无关紧要,但这里的定义是:data Nat=Zero | such Nat data PosNat=One | such'PosNat data Int'=Zero'|加上PosNat |减去PosNat这里的缩进是否与代码中的缩进相同?您需要将
实例
定义移到
声明之外。您需要缩进实例,以便单词
实例
与单词
在同一列开始,即在行的最开头。太好了!就这样!这几乎把我逼疯了。谢谢