Я экспериментировал с линзами ван Лаарховена и столкнулся с проблемой, когда проверка типов отклоняла форму с сокращенным значением эта хорошо типизированной функции:
{-# LANGUAGE RankNTypes #-}
import Control.Applicative
type Lens c a = forall f . Functor f => (a -> f a) -> (c -> f c)
getWith :: (a -> b) -> ((a -> Const b a) -> (c -> Const b c)) -> (c -> b)
getWith f l = getConst . l (Const . f)
get :: Lens c a -> c -> a
get lens = getWith id lens
Вышеупомянутые проверки типов, но если я уменьшу get
до
get :: Lens c a -> c -> a
get = getWith id
Тогда GHC (7.4.2) жалуется, что
Couldn't match expected type `Lens c a'
with actual type `(a0 -> Const b0 a0) -> c0 -> Const b0 c0'
Expected type: Lens c a -> c -> a
Actual type: ((a0 -> Const b0 a0) -> c0 -> Const b0 c0)
-> c0 -> b0
In the return type of a call of `getWith'
In the expression: getWith id
Я могу понять, что если у функции не было явной сигнатуры типа, тогда эта-редукция в сочетании с ограничением мономорфизма может запутать вывод типа, особенно когда мы имеем дело с типами более высокого ранга, но в этом случае я не уверен, что происходит.
Что заставляет GHC отвергать форму с сокращенным числом этажей и является ли это ошибкой / ограничением в GHC или какой-то фундаментальной проблемой с типами более высокого ранга?
Lens
? - person Ingo   schedule 07.05.2013