44. Сравнение классов стандартного класса Eq
и Ord
требует, чтобы оба сравниваемых значения имели одинаковый тип (включая параметр фантомного типа), вам нужно либо определить собственные операторы сравнения, либо использовать экзистенциальную оболочку. Например:
{-# LANGUAGE ExistentialQuantification #-}
newtype MyType a = MyType { getInt :: Int }
data SomeType = forall a . SomeType (MyType a)
instance Eq SomeType where
(SomeType (MyType a)) == (SomeType (MyType b)) = a == b
instance Ord SomeType where
compare (SomeType (MyType a)) (SomeType (MyType b)) = compare a b
test = SomeType a < SomeType b where
a :: MyType Char
a = MyType 10
b :: MyType Float
b = MyType 15
Другой вариант заключается в использовании Data.Coerce
, который позволяет использовать стандартные функции сравнения без написания каких-либо экземпляров шаблонных. Вам просто нужно предоставить некоторые явные сигнатуры типа:
import Data.Coerce
test2 :: Bool
test2 = coerce ((<) :: Int -> Int -> Bool) a b where
a :: MyType Char
a = MyType 10
b :: MyType Float
b = MyType 15
Ваш 'newtype' не является синтаксически правильным. При этом «a1 a -> a -> Bool'. Что вы на самом деле хотите сделать? –
Zeta