Haskell TypeClasses派生规则和不带方法的类

问题描述 投票:1回答:1

我尝试更深入地了解Haskell的Global Variables范式,作为练习,我从事https://kodu.ut.ee/~nestra/eng/splst11.pdf的研究。我要做的第一件事是重写2.1-库模块中的一些代码:更改了此

data family Var a :: *    -- family declaration
class (Show l, Ord l) => Variable l where    -- Class w/o method

class (Show l, Ord l, Eq l) => Variable l where
    data Var l :: *

这应该与原始代码GHC在编译时抱怨的含义相同(我的猜测是..)。然而,(对我而言)奇怪的是,GHC抱怨如果没有使用显式派生子句声明类实例(我的第一次尝试,看起来很多余:

instance Variable Integer where 
    data Var Integer = X | Y deriving (Show, Eq, Ord)

问题:

  1. 不是继承的类“属性”的派生部分-我希望在类实例中不重复此步骤。
  2. 是否可以使用与GHC在Illegal instance declaration for `Variable (Var Int)'行上抱怨instance Variable (Var Int)的纸张相同的风格书写,也许是旧式的haskell(GHC98)?为了避免这种情况,我不得不以不同的方式声明该类。
haskell types typeclass
1个回答
0
投票

[伙计们,这个问题并不是真正的问题,首先我错过了GHC的提示(GHC在我的错误消息中始终对我有些含糊,因此我不习惯于花很多时间阅读它们)-我认为,有了这种缺少的语言实用性,代码就可以顺利运行。对于那些会尝试执行本文的人-添加{-#LANGUAGE FlexibleInstances#-},则可能不会发布任何消息-如果像我一样,您继续在类内部定义数据类型和方法,则在类级别对Eq a添加一个约束(本文在实例级别而不是在类级别实现它)

© www.soinside.com 2019 - 2024. All rights reserved.