Использование анонимных функций в Haskell - PullRequest
0 голосов
/ 31 октября 2018

Я читаю Получите Программирование на Haskell , чтобы получить представление о функциональном программировании. В уроке 10 автор обсуждает использование функционального программирования для создания простых объектов с использованием замыканий. До этого момента в книге темы включали функции высшего порядка, лямбда-функции и замыкания.

Он описывает что-то вроде:

simpleObject intAttribute= \message -> message intAttribute

simpleObject возвращает замыкание, которое в действительности хранит атрибут intAttribute. Закрытие принимает функцию в качестве аргумента и предоставляет intAttribute в качестве параметра. Например (мой):

obj = simpleObject 5
doubleIt x = 2 * x
obj doubleIt (returns 10)

Мне кажется, я достаточно ясно до этого момента.

Затем автор описывает метод доступа, похожий на:

getAttribute y = y (\x -> x)
getAtrribute obj (returns 5)

Код работает, как и ожидалось, возвращая захваченный intAttribute. Это где я заблудился. Как работает код getAttribute?

1 Ответ

0 голосов
/ 31 октября 2018

Мы можем оценить выражение, заменяя каждый определенный идентификатор его собственным определением.

getAtrribute obj
= { def. getAttribute }
obj (\x -> x)
= { def. obj. }
simpleObject 5 (\x -> x)
= { def. simpleObject }
(\message -> message 5) (\x -> x)
= { beta reduction }
(\x -> x) 5
= { beta reduction }
5
...