Использование анонимных функций в Haskell

Я читаю Get Programming with 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?


person min_2_max    schedule 30.10.2018    source источник
comment
Ааа... очень помогает! Я зацикливался на предпоследнем переходе. Большое спасибо!   -  person min_2_max    schedule 31.10.2018
comment
Это второй раз, когда я недавно видел эту странную технику (сначала на stackoverflow.com/q/53023885/4942760 ) . Я думаю, что этот конкретный случай вообще не имеет смысла. Единственное полуразумное использование, о котором я могу думать, — это запись замыканий либо для реализации гаджетов для бедняков (не обязательно, поскольку гаджеты существуют), либо для разрешения каких-то объектов/интерфейсов типа oo (но почему бы не использовать классы типов?). Этот метод не отличается от прямого использования значения (изоморфизм ($id) в одном случае и flip ($) в другом). Чем это должно быть полезно?   -  person Dan Robertson    schedule 31.10.2018
comment
@DanRobertson Я не думаю, что в этом есть какая-то цель, но это просто упражнение по закрытию. Понимание того, что такой изоморфизм существует, также может быть еще одним упражнением. Это в основном об обучении/понимании, чем о том, чтобы быть действительно полезным само по себе (ИМО).   -  person chi    schedule 31.10.2018


Ответы (1)


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

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
person chi    schedule 31.10.2018
comment
Благодарю вас! Комментатор Алек опубликовал выше аналогичную технику, которая также прояснила код. - person min_2_max; 31.10.2018