我正在尝试将整数列表转换为字符列表以类似于成绩。这是我在 Haskell 中的代码:
\n\ngrade :: [int] -> [char]\n\ngrade array = if 90 <= head array then ['A'] ++ grade(tail array)\n else if 80 <= head array then ['B'] ++ grade(tail array)\n else if 70 <= head array then ['C'] ++ grade(tail array)\n else if 60 <= head array then ['D'] ++ grade(tail array)\n else if 60 > head array then ['F'] ++ grade(tail array)\n else [] array\nRun Code Online (Sandbox Code Playgroud)\n\n编译器 GHCi 给我这个错误:
\n\n Couldn't match expected type \xe2\x80\x98[int] -> [char]\xe2\x80\x99\n with actual type \xe2\x80\x98[t0]\xe2\x80\x99\nRelevant bindings include\n array :: [int] (bound at grade.hs:3:7)\n grade :: [int] -> [char] (bound at grade.hs:3:1)\nThe function \xe2\x80\x98[]\xe2\x80\x99 is applied to one argument,\nbut its type \xe2\x80\x98[t0]\xe2\x80\x99 has none\nIn the expression: [] array\nIn the expression:\n if 60 > head array then ['F'] ++ grade (tail array) else [] array\nRun Code Online (Sandbox Code Playgroud)\n\n我不确定“[t0]”是什么意思
\n\n提前致谢
\n\n我将我的代码更改为:
\n\ngrade :: [Int] -> [Char]\n\ngrade array = if 90 <= head array then ['A'] ++ grade(tail array)\n else if 80 <= head array then ['B'] ++ grade(tail array)\n else if 70 <= head array then ['C'] ++ grade(tail array)\n else if 60 <= head array then ['D'] ++ grade(tail array)\n else if 60 > head array then ['F'] ++ grade(tail array)\n else [] = array\nRun Code Online (Sandbox Code Playgroud)\n\n感谢您的建议,但现在它在“=”处给我一个解析错误?我不确定现在出了什么问题
\n实现您想要的效果的更好方法是使用模式匹配:
grade [] = []
grade array = if 90 <= head array then ['A'] ++ grade(tail array)
else if 80 <= head array then ['B'] ++ grade(tail array)
else if 70 <= head array then ['C'] ++ grade(tail array)
else if 60 <= head array then ['D'] ++ grade(tail array)
else ['F'] ++ grade(tail array)
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用模式匹配来消除重复head/tail调用:
grade [] = []
grade (x:xs) = if 90 <= x then ['A'] ++ grade xs
else if 80 <= x then ['B'] ++ grade xs
else if 70 <= x then ['C'] ++ grade xs
else if 60 <= x then ['D'] ++ grade xs
else ['F'] ++ grade(xs)
Run Code Online (Sandbox Code Playgroud)
编辑:要进一步进行 haskellize,您可以使用守卫:
grade [] = []
grade (x:xs)
| 90 <= x = ['A'] ++ grade xs
| 80 <= x = ['B'] ++ grade xs
| 70 <= x = ['C'] ++ grade xs
| 60 <= x = ['D'] ++ grade xs
| otherwise = ['F'] ++ grade xs
Run Code Online (Sandbox Code Playgroud)
编辑 #2:grade根据 @rampion 的评论删除 旁边的括号。
| 归档时间: |
|
| 查看次数: |
8582 次 |
| 最近记录: |