Предполагаемый тип - IO a
, потому что fail msg
может возвращать что угодно (поскольку на самом деле он никогда не возвращается). Тем не менее, остальная часть на самом деле не должна производить IO a
, совершенно нормально превратить ее во что-то более конкретное, то есть IO WhateverYouWant
.
В этом случае вас не волнует возвращаемое значение, поэтому вы должны просто использовать IO ()
, т.е. поставить return ()
в случае else
.
И, как оказалось, в модуле Control.Monad
уже есть функция с именем when condition action
, которая в точности выполняет if condition then action else return ()
, так что вы можете просто использовать эту функцию (или ее аналог unless
, что сводит на нет сохранение условий). вы not
) вместо того, чтобы набирать if
.