Я пытаюсь сделать typeclass для подписанных числовых типов. Вот мой код:Экземпляр Haskell с ограничением
{-# LANGUAGE TypeFamilies, FlexibleContexts, UndecidableInstances #-}
data Sign = Negative | Zero | Positive
deriving (Eq, Ord, Read, Show)
class Signed a where
sign :: a -> Sign
instance Signed Integer where
sign = undefined
компилируется, но я хотел бы, чтобы адаптировать этот код, чтобы работать на любом Integral a
.
instance (Integral a) => Signed a where
sign = undefined
В этот момент он не компилируется.
Я проверил Haskell type family instance with type constraints, но это похоже на проблему, отличную от моей. Я не думаю, что в моем коде есть синтаксическая ошибка .
Вам нужно включить 'OverlappingInstances', я думаю. С другой стороны, я думаю, что положить знак в класс может быть ошибкой в этом случае - просто определите функцию верхнего уровня 'sign :: Integral a => a -> Sign'. –
Просто попробовал. Кажется, не меняется. 'instance Signed Integer' все еще компилируется, но' instance (Integral a) => ... 'все еще терпит неудачу. –
ОК, я поместил ваш код в файл, и GHC сказал мне, что мне нужно включить 'FlexibleInstances' тоже. С этим он компилируется сразу. (Сообщения об ошибках GHC обычно весьма специфичны, о каких расширениях вам нужно включить.) –