I think the "show a simple type, then the 'real' type " solution is pretty good ( especially since you need to be doing type level programming to hit issues where the simple type doesn't hold anyways) , but on the topic of several languages: doesn't  Haskell98 kind of solve the teaching issue? If you're using the standard stuff stick to the old $...<div><br></div><div>I know Racket does some "language swapping" so that a beginner language is available . I don't know how well that works</div>