Я читаю книгу «Изучите Haskell во благо!» Миран Липовача и изучение функций высшего порядка в главе 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"
Однако я не понимаю, как работает оператор конкатенации во втором примере. Как создается выходная строка «ХА-ХА-ХА-ЭЙ»? Любые идеи приветствуются.





For the first example, I understand that the string was produced by using the concatenation operator in the following manner:
"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 ("HAHA " ++) "HEY".
applyTwice f x = f (f x)
applyTwice ("HAHA " ++) "HEY" = ("HAHA " ++) (("HAHA " ++) "HEY")
= ("HAHA " ++) ("HAHA " ++ "HEY")
= ("HAHA " ++) ("HAHA HEY")
= "HAHA " ++ "HAHA HEY"
= "HAHA HAHA HEY"
Я имею в виду... таким же образом? Это становится
"HAHA " ++ "HEY", а затем"HAHA " ++ "HAHA HEY", а затем"HAHA HAHA HEY".