Используя RankNTypes
, можно применять различные виды параметризации. Например, A id :: A
:
newtype A = A { unA :: forall a. a -> a }
Но как насчет случаев, когда мы только заботимся о параметричности функции по ее аргументу? Для конкретного типа случая c будет работать следующее:
newtype X b = X { unX :: forall a. a -> (a, b) }
Например, X (\a -> (a, ())) :: X ()
.
Я хотел бы понять, как (и можно ли) создать тест параметричности, который работает в более общем плане для функций вида \a -> (a, f a)
, где f
может быть постоянным (как указано выше) или потенциально параметризованным c. Этого нельзя добиться с помощью X
. Например, X (\a -> (a, id a))
- ошибка типа. Можно ли это сделать?
Редактировать: Я хотел бы немного отдохнуть или уточнить вопрос. Предположим, у нас есть тип параметризованных преобразователей состояний:
type PState i o a = i -> (a, o)
Предположим также, что мы заинтересованы в статическом обеспечении того, чтобы a
в произвольном m :: PState i o a
никоим образом не зависело от i
. Другими словами, возможно ли определить функцию f
так, чтобы f m
был хорошо типизирован, когда значение m
не зависит от ввода (и в этом случае оценивается как m
) и является в противном случае неправильно набран?