我是Haskell的新员工我遇到了点问题我有以下内容
class Operation a where
evaluate :: a -> Float
data Value = Value {value :: Float} deriving Show
instance Operation Value where
evaluate = value
(+) :: (Operation a, Operation b) => a -> b -> (a, b)
(+) x y = (x, y)
如果我运行(Value 3) Main.+ (Value 5)
,一切都按预期工作。但是(Value 3) + (Value 5)
给出了一个模糊的错误。这是有意义的,因为这是对(+)
的重新定义。
我希望ghci在每次类型是类Operation的示例时都选择Main.+,而在不是类Operation的示例时选择Prelude.+。这里应该没有歧义,因为给定的类型要么是类的示例,要么不是。我怎么能写这个?
非常感谢!
1条答案
按热度按时间j2cgzkjk1#
通常,没有机制来检查否定条件“此类型不是该类的成员”。这是因为类型类示例可以添加到任何模块中,所以要检查负GHC需要读取所有模块,并在每次添加示例时重新编译所有内容。
您应该将操作符重命名为其他名称,或者隐藏
Prelude.+
导入(通过限定的模块导入保持其可访问性)。在后一种情况下,需要使用Prelude.+
作为标准运算符。还有一些其他的选择,利用重叠的示例,但我不确定在这里使用它们是否是一个好主意。