функция не вызывается / не найдена? - PullRequest
1 голос
/ 11 марта 2019

Я новичок в Haskell и не очень знаком с синтаксисом. У меня есть чистая функция, которая имеет 2 целочисленных параметра, а затем хочу вызвать другую функцию и изменить значение одного параметра на возвращаемое значение из вызываемой функции. Однако я получаю сообщение об ошибке «Модули не загружены». Я считаю, что возвращение классифицируется как действие ввода-вывода, и поэтому делает его не чистым, но это только предположение.

Вот код:

percentage A B = (A/B)

grades x y  = do
   if y /= 0 then do  
      x <- percentage x y
      if x > 1 then "Error"
      else
        <code>
   else "Error"

Вот как я это определяю:

percentage :: Double -> Double -> Double
grades :: Double -> Double -> String

Я уже смотрел на другие темы и онлайн, но ни одна из них, кажется, не покрывает изменение параметра.

Спасибо за любые решения и вашу помощь.

1 Ответ

7 голосов
/ 11 марта 2019

Вам необходимо изменить тип 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...