我尝试更深入地了解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)
问题:
Illegal instance declaration for `Variable (Var Int)'
行上抱怨instance Variable (Var Int)
的纸张相同的风格书写,也许是旧式的haskell(GHC98)?为了避免这种情况,我不得不以不同的方式声明该类。[伙计们,这个问题并不是真正的问题,首先我错过了GHC的提示(GHC在我的错误消息中始终对我有些含糊,因此我不习惯于花很多时间阅读它们)-我认为,有了这种缺少的语言实用性,代码就可以顺利运行。对于那些会尝试执行本文的人-添加{-#LANGUAGE FlexibleInstances#-},则可能不会发布任何消息-如果像我一样,您继续在类内部定义数据类型和方法,则在类级别对Eq a添加一个约束(本文在实例级别而不是在类级别实现它)