The dreaded SkolemOccurs problem
The "!SkolemOccurs" problem is a celebrated difficulty with combining (a) termination and (b) completeness, in this example:
type instance F [a] = [F a]
f :: (F [a] ~ a) => ...
Currently we err on the side of completeness, and lose termination:
Simple20.hs:9:1:
Context reduction stack overflow; size = 21
Use -fcontext-stack=N to increase stack size to N
co :: F [F (F (F (F (F (F (F (F (F (F a)))))))))]
~
F (F (F (F (F (F (F (F (F (F a)))))))))
co :: F (F (F (F (F (F (F (F (F a))))))))
~
[F (F (F (F (F (F (F (F (F (F a)))))))))]
co :: F [F (F (F (F (F (F (F (F (F a))))))))]
~
F (F (F (F (F (F (F (F (F a))))))))
co :: F (F (F (F (F (F (F (F a)))))))
~
[F (F (F (F (F (F (F (F (F a))))))))]
co :: F [F (F (F (F (F (F (F (F a)))))))]
~
F (F (F (F (F (F (F (F a)))))))
co :: F (F (F (F (F (F (F a))))))
~
[F (F (F (F (F (F (F (F a)))))))]
co :: F [F (F (F (F (F (F (F a))))))] ~ F (F (F (F (F (F (F a))))))
co :: F (F (F (F (F (F a))))) ~ [F (F (F (F (F (F (F a))))))]
co :: F [F (F (F (F (F (F a)))))] ~ F (F (F (F (F (F a)))))
co :: F (F (F (F (F a)))) ~ [F (F (F (F (F (F a)))))]
co :: F [F (F (F (F (F a))))] ~ F (F (F (F (F a))))
co :: F (F (F (F a))) ~ [F (F (F (F (F a))))]
co :: F [F (F (F (F a)))] ~ F (F (F (F a)))
co :: F (F (F a)) ~ [F (F (F (F a)))]
co :: F [F (F (F a))] ~ F (F (F a))
co :: F (F a) ~ [F (F (F a))]
co :: F [F (F a)] ~ F (F a)
co :: F a ~ [F (F a)]
co :: F [F a] ~ F a
co :: a ~ [F a]
co :: F [a] ~ a