функция не вызывается / не найдена?

1
задан Andrew Foot 11 March 2019 в 13:41
поделиться

1 ответ

Вам необходимо изменить тип 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
0
ответ дан chepner 11 March 2019 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: