我是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
我已经看过其他线程和在线内容,但是似乎都没有涉及参数的更改。
感谢您提供任何解决方案和帮助。
答案 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