Добавить переменную типа в определение нового типа

В упражнении из Haskell Programming from First Principles говорится, что нужно объявить экземпляр TooMany для типа (Num a, TooMany a) => (a, a), сначала создав для него newtype. Моя проблема заключается в добавлении ограничения типа к Baz. Это вообще возможно? Я не могу найти другие примеры в Интернете.

class TooMany a where
  tooMany :: a -> Bool

newtype Baz = Baz (a, a) deriving (Eq, Show)

instance TooMany Baz where
  tooMany (Baz (n, _)) = n > 42

person Brady Dean    schedule 12.03.2019    source источник
comment
@WillNess Вам также нужно Ord a, но мне это нравится. Я думаю, что автор имел в виду включить это в упражнение, иначе первый элемент не может быть использован много раз.   -  person Brady Dean    schedule 12.03.2019
comment
есть много возможных определений для этих двух ограничений, например. tooMany (n+1) || tooMany m.   -  person Will Ness    schedule 13.03.2019


Ответы (1)


Вероятно, вам нужно использовать аргумент для Baz:

newtype Baz a = Baz (a, a) deriving (Eq, Show)
        -- ^^^ --

instance (Num a, TooMany a) => TooMany (Baz a) where
   ...

Я не уверен, для чего нужен Num a, но я добавил это, поскольку вы упомянули об этом.

person chi    schedule 12.03.2019
comment
Я подумал, что нужно идти в конструктор типа, просто не мог понять синтаксис. - person Brady Dean; 12.03.2019