Почему вы не можете (полностью) применить синоним типа, аргументы которого используют синоним другого типа?

Мы можем определить синонимы типов с аргументами, и это прекрасно работает при использовании с реальными типами:

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 жалуется, что я не передал аргументы?

Разве синоним типа не должен быть полностью прозрачным и не отличимым от других типов?

Есть ли способ достичь ожидаемого поведения?

Ответы на вопрос(1)

Ваш ответ на вопрос