Предположим, у меня есть параметрический тип, определенный следующим образом:
newtype FancyComplex a b = FancyComplex (a, b)
Я намерен никогда не использовать этот новый тип для любых других параметров, кроме числовых. Я имею в виду, что для любой реализации я знаю, что параметры a
и b
всегда будут экземпляром Num
.
Я прочитал в этом вопросе, что вы можете сделать это: Можно ли использовать ограничение класса типов в определении нового типа?
{-# LANGUAGE RankNTypes #-}
newtype (Num a, Num b) => FancyComplex a b = FancyComplex (a, b)
Однако этого недостаточно. Если я напишу любой класс следующим образом:
class StupidClass x where add :: x -> x -> x
Тогда я смогу написать
instance StupidClass (FancyComplex a b) where
add (FancyComplex (a, b)) (FancyComplex (a', b')) = FancyComplex (a+a', b+b')
Но ни один GHC не скажет мне, что я не соблюдал требование Num
. Поэтому я вынужден делать это каждый раз:
instance (Num a, Num b) => StupidClass (FancyComplex a b) where
add (FancyComplex (a, b)) (FancyComplex (a', b')) = FancyComplex (a+a', b+b')
Все, что делает написание ограничения в определении нового типа, — это заставляет меня каждый раз писать ограничение явно. Хорошо, это все еще полезно, если я забуду. Но, конечно, я бы ожидал, что не придется каждый раз переписывать ограничение.
Как я могу автоматически и неявно наследовать ограничения из определения нового типа? Это возможно? если нет, то есть ли причина, почему нет?
В настоящее время мой слабый обходной путь - определить псевдоним типа type FancyComplexReqs a b = (Num a, Num b)
Спасибо
newtype
считается ошибкой, если я правильно помню (books.google.be/). Написание ограничения полезно, так как оно встречается в подписиinstance
, а значит, и в документации. Но если вы не ограничиваете свой тип на уровнеnewtype
, он будет ограничен из-за использования(+)
в вашем определении. - person Willem Van Onsem   schedule 11.05.2020type FancyComplexReqs a b = (Num a, Num b)
). Вы также можете прикрепить документацию, объясняющую, почему эти ограничения полезны для повсеместного применения. - person Ben   schedule 11.05.2020Functor
, которые требуют меньше ограничений. - person Ben   schedule 11.05.2020