【发布时间】:2018-01-13 11:46:24
【问题描述】:
我是 Haskell 的新手,所以我不太清楚如何操纵守卫中的操作顺序或对守卫中的“位置”表达式施加更多限制。 这是我在 Haskell 中的第一个程序,其中需要遵循一些神秘的标记方案,它会返回你的字母等级。它适用于所有非负输入,但轮函数似乎在负输入上失败。这是我的代码:
roundMark :: Float -> Integer
roundMark mark
| mark2 < 0 = 0
| mark2 > 100 = 100
| otherwise = mark2
where mark2 = round mark
letterGrade :: Float -> Char
letterGrade mark
| newMark < 48 = 'F'
| newMark >= 48 && newMark < 65 = 'C'
| newMark >= 65 && newMark < 79 = 'B'
| otherwise = 'A'
where newMark = roundMark mark
对于负输入,我得到错误
No instance for (Num (Float -> Char)) arising from a use of ‘-’
(maybe you haven't applied a function to enough arguments?)
我想知道是否有一种方法可以限制我的 where 表达式在尝试使用 round 函数之前为负输入返回 0,或者我是否可以将我的防护置于条件中。
【问题讨论】:
-
负数失败是什么意思?
-
因为我得到错误 No instance for (Num (Float -> Char)) 由使用 '-' 引起(也许你没有将函数应用于足够的参数?)跨度>
-
在问题中发布完整的错误。从表面上看,我看不出有什么会导致这样的错误。
-
这看起来像是编译时错误,而不是运行时错误。它不应该只显示某些输入。它指向哪里?您不要在此代码中的任何地方使用
-。 -
我尝试了使用 letterGrade (-1) 而不是 letterGrade -1 的函数。我不知道它们是不同的东西。谢谢。
标签: haskell functional-programming guard