如果这样做:
Prelude Data.Char> map toUpper ("sdfsd" ++ "dfgfdg")
"SDFSDDFGFDG"
Run Code Online (Sandbox Code Playgroud)
那为什么不这样呢?
Prelude Data.Char> map toUpper . (++) "sdfsd" "dfgfdg"
<interactive>:1:14:
Couldn't match expected type `a -> [Char]'
against inferred type `[Char]'
In the second argument of `(.)', namely `(++) "sdfsd" "dfgfdg"'
In the expression: map toUpper . (++) "sdfsd" "dfgfdg"
In the definition of `it': it = map toUpper . (++) "sdfsd" "dfgfdg"
Run Code Online (Sandbox Code Playgroud)
sep*_*p2k 13
map toUpper . (++) "sdfsd" "dfgfdg"
Run Code Online (Sandbox Code Playgroud)
被解析为:
(map toUpper) . ((++) "sdfsd" "dfgfdg")
Run Code Online (Sandbox Code Playgroud)
所以基本上你在做
(map toUpper) . "sdfsddfgfdg"
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为第二个参数.需要是一个函数,而不是一个字符串.
我假设你正在尝试做更像的事情(map toUpper . (++)) "sdfsd" "dfgfdg".这也不起作用,因为返回类型++是[a] -> [a]参数类型map toUpper是[a].
这里的事情是,虽然有人可能会认为++它是一个带有两个列表并返回一个列表的函数,但它实际上是一个函数,它接受一个列表,然后返回一个函数,该函数接受另一个列表并返回一个列表.为了获得你想要的东西,你需要++进入一个带有两个列表元组并返回一个列表的函数.那被称为uncurrying.以下作品:
map toUpper . (uncurry (++)) $ ("sdfsd", "dfgfdg")
Run Code Online (Sandbox Code Playgroud)
你想要$而不是.:map toUpper $ (++) "sdfsd" "dfg"工作,做你想要的.原因是它$是一个非常低优先级的函数应用程序,因此更正后的版本读作:"将函数map toUpper应用于结果(++) "sdfsd" "dfg"".