I'm having fun writing a simple type checker, but I'm learning firsthand why syntax-directed checking doesn't work. It prevents inference. My checker catches real bugs, but it can't handle cases like this: [1, 2].map(fun(x) { x + 1; }) I think I need bidirectional checking.