函数没有被调用/未找到?

时间:2019-03-11 13:41:57

标签: haskell functional-programming

我是Haskell的新手,并且对语法不太熟悉。我有一个具有2个整数参数的纯函数,然后想调用另一个函数,并使用被调用函数的返回值更改一个参数的值。但是,我收到错误消息“未加载模块”。我认为返回值被归类为I / O操作,因此它不是纯粹的,但这只是一个猜测。

代码如下:

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 个答案:

答案 0 :(得分:7)

您需要更改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