Haskell: вопрос о частичном применении - PullRequest
3 голосов
/ 04 июня 2019

Я читаю книгу «Учим тебя на хаскеле за великое благо!» Миран Липовака и изучение функций высшего порядка в главе 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"

Однако я не понимаю, как работает оператор конкатенации во втором примере. Как получается выходная строка "HAHA HAHA HEY"? Любые идеи приветствуются.

1 Ответ

3 голосов
/ 04 июня 2019

В первом примере я понимаю, что строка была получена с помощью оператора конкатенации следующим образом:

"HEY" ++ " HAHA"
"HEY HAHA" ++ " HAHA"
"HEY HAHA HAHA"

Вместо прямого перехода к выражению инфикса (т.е.* * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 101 * * * * * * * * * * applyTwice * * * * * * * *1011* * * * * * * *1011*

Теперь сделайте то же самое с 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"
...