Haskell:关于部分应用的问题

Haskell:关于部分应用的问题,haskell,functional-programming,higher-order-functions,partial-application,Haskell,Functional Programming,Higher Order Functions,Partial Application,我正在读一本书“为你学习哈斯克尔的伟大利益!”由Miran Lipovaca和第5章学习高阶函数 其中一个示例涉及以下功能: applyTwice :: (a -> a) -> a -> a applyTwice f x = f (f x) 以下是函数输出的示例: ghci> applyTwice (++ " HAHA") "HEY" "HEY HAHA HAHA" ghci> applyTwice ("HAHA " ++) "HEY" "HAHA HAHA H

我正在读一本书“为你学习哈斯克尔的伟大利益!”由Miran Lipovaca和第5章学习高阶函数

其中一个示例涉及以下功能:

applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
以下是函数输出的示例:

ghci> applyTwice (++ " HAHA") "HEY"
"HEY HAHA HAHA"

ghci> applyTwice ("HAHA " ++) "HEY"
"HAHA HAHA HEY"
对于第一个示例,我了解字符串是通过以下方式使用串联运算符生成的:

"HEY" ++ " HAHA"
"HEY HAHA" ++ " HAHA"
"HEY HAHA HAHA"
"HEY" ++ " HAHA"
"HEY HAHA" ++ " HAHA"
"HEY HAHA HAHA"
但是,我不理解第二个示例中的串联运算符是如何工作的。输出字符串“哈哈嘿”是如何产生的?任何见解都将不胜感激

对于第一个示例,我了解字符串是通过以下方式使用串联运算符生成的:

"HEY" ++ " HAHA"
"HEY HAHA" ++ " HAHA"
"HEY HAHA HAHA"
"HEY" ++ " HAHA"
"HEY HAHA" ++ " HAHA"
"HEY HAHA HAHA"
与其直接跳转到中缀表达式(即,
++
介于两者之间),不如从函数的角度考虑

(++ " HAHA") :: [Char] -> [Char]   -- #1 this is a function (++ is partially applied)     
"HEY" :: [Char]

(++ " HAHA") "HEY"                 -- apply "HEY" as an argument to #1
-- same as "HEY" ++ " HAHA"

(+) :: (Num a) => a -> a -> a      -- #2 a binary function
(+) 1 2                            -- #3 apply 1 and 2 as arguments to #2
-- same as 1 + 2

-- technically, #3 is curried as
--    ((+) 1) 2                    -- i.e. (+) 1 is a partially applied function, which is then applied to 2     
如果将
(++“HAHA”)
替换为
applyTwice
的定义,您将得到

applyTwice f x = f (f x)
applyTwice (++ " HAHA") "HEY" = (++ " HAHA") ((++ " HAHA") "HEY")

                              = (++ " HAHA") ("HEY" ++ " HAHA")
                              = (++ " HAHA") ("HEY HAHA")
                              = "HEY HAHA" ++ " HAHA"
                              = "HEY HAHA HAHA"
现在对applyTwice做同样的操作(“哈哈”+)“嘿”


我是说。。。同样的方式?它变成了
“哈哈”+“嘿”
,然后变成
“哈哈”+“哈哈嘿”
,然后变成
“哈哈哈哈嘿”