Haskell函数组成问题

art*_*ave 9 haskell

如果这样做:

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")"dfgfdg"'应该完成这项工作.确实如此.谢谢. (5认同)

yat*_*975 7

你想要$而不是.:map toUpper $ (++) "sdfsd" "dfg"工作,做你想要的.原因是它$是一个非常低优先级的函数应用程序,因此更正后的版本读作:"将函数map toUpper应用于结果(++) "sdfsd" "dfg"".