我是Haskell的新手,并且在定义一个将所有小写字母转换为大写并保持其余部分完整的函数方面存在一些问题。
到目前为止,我试图在我的书中解决这个问题:
capitalise :: String -> String
capitalise xs = [capitalise2 ch| ch<-xs]
capitalise2 :: Char -> Char
capitalise2 ch
| isLower ch = chr (ord ch - 32)
| otherwise = ch
我收到错误:
p3.hs:6:7: Not in scope: `isLower'
p3.hs:6:23: Not in scope: `chr'
p3.hs:6:28: Not in scope: `ord'
非常感谢任何帮助。
答案 0 :(得分:17)
首先,您需要import Data.Char
使用它抱怨的那些功能。
是的,你错过了新功能中的otherwise
个案。尝试使用if .. then .. else
构造。有经验的Haskeller不会非常使用那个结构;我可能会用辅助函数来做这件事:
capitalize cs = [ toUpper c | c <- cs ]
where
toUpper ...
与你已经拥有的几乎相同,主要区别在于辅助函数的范围。
这也可能是摆脱列表理解并开始使用更高阶函数的好机会。尝试使用map而不是列表理解来编写此函数。
答案 1 :(得分:8)
这本书是否解释了标准库?
import Data.Char (toUpper)
capitalise = map toUpper
答案 2 :(得分:3)
您需要将isLower
部分用于表达式,而不是将其用作过滤器。
[if isLower ch then chr (ord ch - 32) else ch | ch <- xs]
或者,将助手功能移到里面。
capitalise = map capitalise'
where capitalise' ch
| isLower ch = chr (ord ch - 32)
| otherwise = ch