Предположим, что у меня полиморфный тип, где один из параметров - более высокий тип (* -> *
).Производятся с переменными типа более высокого типа
data Tricky m = Tricky { numbers :: m Int, genesis :: m String }
Существует ли общий способ получения экземпляров для таких типов без использования тайных и небезопасных языковых расширений?
Я пытался позволяет StandaloneDeriving
, так что я мог бы указать контекст:
deriving instance Show (m Int) => Show (Tricky m)
Но GHC затем жалуется на ограничение не будучи не меньше, чем голова экземпляра, и указывает мне в направлении UndecidableInstances
.
Резюмируя:
1. Должен ли я просто идти вместе с этим советом, или есть способ лучше?
2. Есть ли какие-либо предложения, чтобы облегчить этот процесс?
3. Как-то нехорошо хотеть выводить «высшие» экземпляры? Было бы лучше, чтобы получить экземпляры для нескольких конкретных типов вместо (например. Vector
, []
, Set
)