ControllerDeviceEventData (corresponding to SDL_CONTROLLERDEVICEADDED) has a 'which' field. The haskell binding claims this is a Joystick Instance ID. Instead this appears to be a device id, which makes sense because after the controller connects you would want to open it, which requires the device id. The joystick id would not exist until it's opened.