Quando ho un tipo di dati come il seguente in Haskell:vincoli tipi: Passare più vincoli
data A ctx = A (forall a. ctx a => a -> a)
Poi posso mettere funzioni che lavorano sui valori di tipi di una determinata classe in questo tipo di dati:
> A (+3) :: A Num
A (+3) :: A Num :: A Num
Ma è anche possibile inserire funzioni che hanno più vincoli in questo tipo di dati? Ho provato questo:
> :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)
Quindi questo non funziona. Com'è possibile fare ciò che voglio, o è impossibile? So che una soluzione sarebbe utilizzare un tipo di dati "fittizio" e una famiglia di tipi, ma non voglio farlo se c'è un altro modo a causa della sua complessità. Inoltre, io questo esempio avrei potuto usare (+1) invece di succ, ma ci sono casi più complessi in cui una tale trasformazione in una sola classe non è possibile.
Che dire di un altro typeclass come 'classe (Num una, Enum a) => Foo a'? – thoferon
Sì, ovviamente funzionerebbe anche, ma non mi piace molto fare una classe di tipo solo per combinare due contesti – bennofs