We recommend running GHCi in a standard Windows console:
  select the GHCi option from the start menu item
  added by the GHC installer, or use
  Start->Run->cmd to get a Windows console and
  invoke ghci from there (as long as it's in your
  PATH).
If you run GHCi in a Cygwin or MSYS shell, then the Control-C
  behaviour is adversely affected.  In one of these environments you
  should use the ghcii.sh script to start GHCi,
  otherwise when you hit Control-C you'll be returned to the shell
  prompt but the GHCi process will still be running.  However, even
  using the ghcii.sh script, if you hit Control-C
  then the GHCi process will be killed immediately, rather than
  letting you interrupt a running program inside GHCi as it should.
  This problem is caused by the fact that the Cygwin and MSYS shell
  environments don't pass Control-C events to non-Cygwin child
  processes, because in order to do that there needs to be a Windows
  console.
There's an exception: you can use a Cygwin shell if the
  CYGWIN environment variable does
  not contain tty.  In this
  mode, the Cygwin shell behaves like a Windows console shell and
  console events are propagated to child processes.  Note that the
  CYGWIN environment variable must be set
  before starting the Cygwin shell; changing it
  afterwards has no effect on the shell.
This problem doesn't just affect GHCi, it affects any GHC-compiled program that wants to catch console events. See the GHC.ConsoleHandler module.