Когда у меня есть тип данных, как следующее в Haskell:Constraint видов: Проходят несколько ограничений
data A ctx = A (forall a. ctx a => a -> a)
Тогда я могу положить функции, которые работают по значениям типов данного класса в этот тип данных:
> A (+3) :: A Num
A (+3) :: A Num :: A Num
Но можно ли также поместить функции, которые имеют несколько ограничений в этом типе данных? Я пробовал:
> :t ((+ 3) . succ)
((+ 3) . succ) :: (Enum c, Num c) => c -> c
> :t A ((+ 3) . succ) :: A (Enum,Num)
Expecting one more argument to `Enum'
In an expression type signature: A (Enum, Num)
In the expression: A ((+ 3) . succ) :: A (Enum, Num)
Так что это не работает. Как можно делать то, что я хочу, или это невозможно? Я знаю, что одним из решений было бы использовать «фиктивный» тип данных и семейство типов, но я не хочу этого делать, если есть другой способ из-за его сложности. Кроме того, в этом примере я мог бы просто использовать (+1) вместо succ, но есть более сложные случаи, когда такое преобразование только в один класс невозможно.
насчет другого класса типов, как 'класса (Num а, Enum а) => Foo Ā'? – thoferon
Да, это, конечно же, будет работать, но мне не очень нравится создавать класс типа только для объединения двух контекстов – bennofs