我正在尝试将此数据类型放在Haskell集中,但我不想给它一个Ord的一般实例.所以我想在y-coördinate上给这个集合订购,但没有实例Ord Vector.这可能吗?
data Vector = V
{ x :: Double
, y :: Double
} deriving (Eq)
Run Code Online (Sandbox Code Playgroud)
Set
要求您使用Ord
元素类型的默认实例.
如果要使用其他Ord
实例,标准方法是使用自定义newtype
包装器,然后Ord
为其编写实例:
newtype Y = Y { unY :: Vector } deriving Eq
instance Ord Y where compare = comparing ((y . unY) &&& (x . unY))
Run Code Online (Sandbox Code Playgroud)
但由于这种比较方式与二进制元组的比较方式相同,因此KennyTM的解决方案最简单.