Вам необходимо изменить тип grades
и отказаться от неуместной записи do
; Вы не делаете никаких монадических вычислений. Кроме того, переменные должны начинаться со строчных букв; имена с большой буквы обозначают тип или класс типов.
percentage :: Double -> Double -> Double
percentage a b = a / b
grades :: Double -> Double -> Either String Double
grades x 0 = Left "Zero denominator"
grades x y = let p = percentage x y
in if p > 1 then Left "Greater than 100%"
else Right p
Другой альтернативой является предварительное определение возникающих условий ошибки, а не возврат произвольных строк для их описания; не каждая строка будет описывать одну из двух возможных ошибок, но каждое значение PercentageError
делает.
data PercentageError = ZeroDenominator | Over100Percent
grades :: Double -> Double -> Either PercentageError Double
grades x 0 = Left ZeroDenominator
grades x y = let p = percentage x y
in if p > 1 then Left Over100Percent
else Right p