Haskell 大于或等于

1 recursion haskell

我正在尝试将整数列表转换为字符列表以类似于成绩。这是我在 Haskell 中的代码:

\n\n
grade :: [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\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不确定“[t0]”是什么意思

\n\n

提前致谢

\n\n

我将我的代码更改为:

\n\n
grade :: [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\n
Run Code Online (Sandbox Code Playgroud)\n\n

感谢您的建议,但现在它在“=”处给我一个解析错误?我不确定现在出了什么问题

\n

fja*_*rri 5

实现您想要的效果的更好方法是使用模式匹配:

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 的评论删除 旁边的括号。