map
的簽名是(a -> b) -> [a] -> [b]
,這意味着它需要2個參數並返回一個列表。 然而下面的函數,其將一個字符串轉換爲第一個字母大寫的克隆是錯誤的:haskell:地圖的好用法,參數的數目
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個參數(λ函數和words
的結果),這是很多參數。
你能幫助我嗎?
對於map函數,我寧願'map(\(x:xs) - > toUpper x:xs)'。一般來說,沒有理由比'x:xs'更喜歡使用'[x] ++ xs',模式匹配幾乎總是優於頭部和尾部。 –
@ReinHenrichs的確,不幸的是,'words'返回一列列表而不是'NonEmpty'列表。 – dfeuer
後人快速提示:我把它作爲X的副本,這是Y的副本。不過,我認爲X和Y之間有一些細微的不同,這個問題不是Y的重複;但X的答案確實解決了這個問題中出現的混亂。 (可能X首先不應該是Y的重複,儘管我可以明白爲什麼它以這種方式關閉。) –