Учитывая эту строку кода Haskell, моя задача состояла в том, чтобы оценить ее в самой простой форме.
let g h k = (\x -> k (h x)) in g (+1) (\x -> x+x) 20
Мне уже дали ответ (и, конечно же, он сам оценил его в GHCI): 42
Однако я хотел бы получить лучшее представление о том, как эта оценка действительно работает здесь. В общем, я думаю, что знаю, как (простые) выражения работают:
Пример
a = let y = 5 in y * 5 -- a == 25
Это оценивается как 25
, потому что мы привязываем y
к значению 5
и a
присваивается значение y*5
(часть после in
). Связывание y = 5
допустимо только в пределах области let
.
Пока единственная интерпретация (которая, по меньшей мере, оценивается до 42), такова:
let g h k = (\x -> k (h x)) in g (+1) (\x -> x+x) 20
-
g
(\x -> k (h x))
-
h
-(+1)
(функция(\x -> x+1)
) -
k
(\x -> x+x)
-
20
- это входg
, который даетk (h 20)
-
h 20
дает20 + 1
=21
-
k (h 20)
=k 21
=21 + 21
=42
-
Но меня смущает использование g h k
после let. Что это значит?