【发布时间】:2015-10-06 16:01:44
【问题描述】:
map 的签名是(a -> b) -> [a] -> [b],这意味着它接受 2 个参数并返回一个列表。
然而,以下将字符串转换为首字母大写克隆的函数是错误的:
modernise :: String -> String
modernise s = unwords . map (\m -> [toUpper (head m)] ++ tail m) (words s)
好的版本是:
modernise :: String -> String
modernise = unwords . map (\m -> [toUpper (head m)] ++ tail m) . words
第一个版本被拒绝,错误提示:"too many arguments for the map function";但我给出了 2 个参数(lambda 函数和 words 的结果),这是很好的参数数量。
你能帮帮我吗?
【问题讨论】:
-
我更喜欢
map (\(x:xs) -> toUpper x : xs)的地图功能。一般来说,没有理由更喜欢[x] ++ xs而不是x : xs,而且模式匹配几乎总是应该优先于头部和尾部。 -
@ReinHenrichs,确实如此,不幸的是,
words返回的是列表列表而不是NonEmptys 列表。 -
后人快速说明:我将其作为问题 X 的副本关闭,它是 Y 的副本。但是,我认为 X 和 Y 之间存在一些细微的差异,这使得这个问题不是Y的副本;但是 X 处的答案确实解决了这个问题引起的混乱。 (可能 X 首先不应该是 Y 的副本,尽管我可以理解为什么它会以这种方式关闭。)
标签: haskell