Почему вы не можете (полностью) применить синоним типа, аргументы которого используют синоним другого типа?
Мы можем определить синонимы типов с аргументами, и это прекрасно работает при использовании с реальными типами:
type MyType t = t String String
data Test a b = Test a b
f :: MyType Test
f = undefined
main = undefined
Компиляция этого не приводит к ошибкам:
$ghc --make test.hs
[1 of 1] Compiling Main ( test.hs, test.o )
Linking test ...
Однако это не работает, когдаTest
это синоним типа:
type MyType t = t String String
data Test a b = Test a b
type Test' a b = Test a b
f :: MyType Test'
f = undefined
main = undefined
Что дает следующую ошибку:
$ghc --make test.hs
[1 of 1] Compiling Main ( test.hs, test.o )
test.hs:7:6:
Type synonym Test' should have 2 arguments, but has been given none
In the type signature for `f': f :: MyType (Test')
Что меня озадачивает то, чтоTest'
является применительно к двум аргументам, так почему GHC жалуется, что я не передал аргументы?
Разве синоним типа не должен быть полностью прозрачным и не отличимым от других типов?
Есть ли способ достичь ожидаемого поведения?