У меня есть объявление функции высокого порядка, чтобы дважды применить функцию, заданную в качестве аргумента:
twice :: (a -> a) -> a -> a
twice f x = f (f x)
Путаница возникает из-за этого сеанса GHCi:
*Main> let _4 = twice twice
*Main> let __4 = twice twice (*2)
*Main> let _16 = _4 _4
*Main> let __16 = _4 __4
*Main> _16 (*2) 2
231584178474632390847141970017375815706539969331281128078915168015826259279872
*Main> __16 2
131072
С __16
это вроде ясно, потому что происходит просто "умножение" этого вызова функции, поэтому мы фактически получим (2 ^ 16) * 2
после его вызова. Насколько я понимаю, это происходит потому, что функция, указанная в качестве параметра, уже частично применяется, поэтому тип __4 и __16 - (Num a) => a -> a
.
Но результат вызова _16
с заданной функцией и целочисленными аргументами приводит меня в замешательство. Я могу понять, что типы _4
и _16
являются необработанными (равны сигнатуре функции twice
, но вложены под капот), но это не дает мне ни малейшего представления о том, почему результаты так сильно различаются. Я просто не могу понять семантику программы после предоставления функции, которая частично не применяется в качестве аргумента. Может кто-нибудь объяснить, почему это число ТАКОЕ ВЕЛИКОЛЕПНОЕ?