Haskell Constraint is no smaller than the instance head

后端 未结 2 1314
面向向阳花
面向向阳花 2020-12-05 00:13

Some rings can be equipped with a norm function:

class (Ring.C a) => EuclideanDomain a where
  norm :: a -> Integer

With this functio

2条回答
  •  半阙折子戏
    2020-12-05 00:52

    hammar's already provided a solution; I'd like to point out another problem with this example. What you want to express is "Whenever a type is an instance of Eq and EuclideanDomain, use this rule to make an instance for Ord." But this is inexpressible in Haskell. The line

    instance (EuclideanDomain a, Eq a) => Ord a where
    

    actually means, "Use this rule to make an Ord instance for any type. It's an error if instances of EuclideanDomain and Eq aren't in scope". That's not good, because this rule will overlap with every other Ord instance.

    Basically any time you want to write an instance Class typevar, you're going to need a newtype.

提交回复
热议问题