Uma das coisas que sempre tento lembrar quando estou resolvendo um problema em Haskell é: Preguiça.
Veja este código por exemplo:
module Alarm where
setAlarm :: Bool -> Bool -> Bool
setAlarm True False = True
setAlarm False False = False
setAlarm False True = False
setAlarm True True = False
Você pode notar claramente um padrão em que o segundo argumento não importa, portanto, use caracteres curinga nestes cenários:
setAlarm :: Bool -> Bool -> Bool
setAlarm True False = True
setAlarm _ _ = False