Size: a a a

2020 July 15

KV

Kirill Valyavin in Haskell
greelot
Но не до конца
Например: есть функция (+) :: Int -> Int -> Int (немного упростил)
Можно скормить ей один аргумент:
(+) 1 :: Int -> Int
Получится функция, которая добавляет единичку
Потом можно ещё один аргумент
(+) 1 2 :: Int то же что 3
источник

g

greelot in Haskell
Kirill Valyavin
Принимается первый аргумент, возвращается новая функция
В эту новую функцию скармливается новый аргумент
И так далее пока не останется просто значение
Первый аргумент испаряется что-ли?
источник

к

кана in Haskell
первый аргумент сохраняется в замыкании
источник

g

greelot in Haskell
кана
первый аргумент сохраняется в замыкании
А что это?
источник

g

greelot in Haskell
Я только короткое знаю
источник

к

кана in Haskell
plus a b = a + b
plus a = \b -> a + b
plus 5 = \b -> 5 + b

let f = plus 5
f 10 = (\b -> 5 + b) 10 = 5 + 10 = 15
источник

KV

Kirill Valyavin in Haskell
Почему это полезно: потому что можно написать
Haskell> let plusThree = (+) 3
Haskell> map plusThree [1..10]
[4,5,6,7,8,9,10,11,12,13]
источник

KV

Kirill Valyavin in Haskell
Или сразу map (+3) [1..10]
источник

ND

Nikita Domnickij in Haskell
a -> a -> a применяешь первый аргумент, получаешь функцию вида a -> a, применяешь второй аргумент, получаешь результат a
источник

KV

Kirill Valyavin in Haskell
greelot
Первый аргумент испаряется что-ли?
Они все запоминаются до тех пор, пока не получится окончательное значение
источник

KV

Kirill Valyavin in Haskell
Замыкание — это механизм запоминания
источник

g

greelot in Haskell
Хорошо, я понимаю так.

Допустим есть функция с типом
(a -> a) -> a

Эта функция, сначала из первого значения типа a делает второе значение типа а, потом первое значение типа a, забывается и испаряется, и уже из полученного второго значения типа а, делается третье значение типа a

Так что-ли?
источник

KV

Kirill Valyavin in Haskell
greelot
Хорошо, я понимаю так.

Допустим есть функция с типом
(a -> a) -> a

Эта функция, сначала из первого значения типа a делает второе значение типа а, потом первое значение типа a, забывается и испаряется, и уже из полученного второго значения типа а, делается третье значение типа a

Так что-ли?
Нет, из-за скобок совсем другое получилось
источник

g

greelot in Haskell
Kirill Valyavin
Нет, из-за скобок совсем другое получилось
Тогда ничего не понятно
источник

KV

Kirill Valyavin in Haskell
Kirill Valyavin
Это то же, что a -> a -> a. Действительно, можно не ставить скобки
Но (a -> a) -> a уже другой тип, там надо
Вот же, это просто разные типы
источник

g

greelot in Haskell
Kirill Valyavin
Замыкание — это механизм запоминания
Это разве не то же самое, что и принятие двух аргументов?
источник

к

кана in Haskell
все проще, лямбды имеют рантаймное представление, лямбда это пара из ссылку на функцию и среза скоупа в момент создания этой лямбды

f =
 let t = 5
 in \x -> x + t

g =
 let t = 10
 in \x -> x + t

вроде абсолютно две одинаковые лямбды, \x -> x + t, но они имеют разный срез скоупа (+, и t = 5 и 10), поэтому это две разные в рантайме лямбды, и мы можем вызвать f 2 и получить 7, хоть уже нет у нас t в скоупе, это сохранилось в срезе скоупа лямбды
источник

KV

Kirill Valyavin in Haskell
greelot
Это разве не то же самое, что и принятие двух аргументов?
Почти то же, но не совсем
источник

g

greelot in Haskell
Kirill Valyavin
Почти то же, но не совсем
И что означает это "не совсем"
источник

KV

Kirill Valyavin in Haskell
Вот это
источник