Я могу делать только ранг-n типов в Idris 0.9.12 довольно неуклюжим способом:
tupleId : ((a : Type) -> a -> a) -> (a, b) -> (a, b)
tupleId f (a, b) = (f _ a, f _ b)
Мне нужны символы подчеркивания везде, где есть приложение типа, потому что Idris бросает ошибки разбора, когда я пытаюсь сделать неявные (вложенные) аргументы типа:
tupleId : ({a : Type} -> a -> a) -> (a, b) -> (a, b) -- doesn't compile
Вероятнее всего, большая проблема заключается в том, что я вообще не могу ограничивать класс в типах более высокого ранга. Я не могу перевести следующую функцию Haskell в Idris:
appShow :: Show a => (forall a. Show a => a -> String) -> a -> String
appShow show x = show x
Это также мешает мне использовать функции Idris как синонимы типов для таких типов, как Lens
, который Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
в Haskell.
Любой способ исправить или обойти вышеупомянутые проблемы?