История изменений
Исправление quasimoto, (текущая версия) :
http://www.scs.stanford.edu/11au-cs240h/notes/ghc-slides.html
http://www.scs.stanford.edu/11au-cs240h/notes/memory-slides.html
(http://www.scs.stanford.edu/11au-cs240h/notes/, http://www.scs.stanford.edu/14sp-cs240h/slides/)
^ В heap profiler-е FUN_* вполне можно иногда увидеть, то есть они динамически генерируются (хотя и тонкой прослойкой, благодаря оптимизациям).
Пример (let ((a 1)) (lambda (b) (+ a b)))
как ((lambda (a) (lambda (b) (+ a b))) 1)
редуцируется до (lambda (b) (+ 1 b))
, так что не пример — нужно чтобы нельзя было редуцировать по месту определения (то что можно редуцировать по месту использования не интересно — в общем случае они не известны).
Типичный пример:
(+)
\x -> (+x)
\x y -> x + y
\x -> \y -> x + y
(не масло масляное, а просто в языке с частичными применениями всё потенциально замыкание)
(defun adder (a) (lambda (b) (+ a b)))
auto adder(int x) { return [=](int y) { return x + y; }; }
или
map (*) -- :: [Int] -> [Int -> Int]
map (\x -> (*x))
map (\x y -> x * y)
map (\x -> \y -> x * y)
\xs -> map (\x -> \y -> x * y) xs
(есть код (*), map (*) возвращает из списка чисел список функций умножающих на эти числа — наверно это будет список замыканий в общем случае)
(defun mm (xs)
(mapcar (lambda (x) (lambda (y) (* x y))) xs))
auto mm(std::vector<int> const& xs) {
std::vector<std::function<int(int)>> rs;
for (auto const x : xs) rs.push_back([=](int y) { return x * y; });
return rs;
}
Исправление quasimoto, :
http://www.scs.stanford.edu/11au-cs240h/notes/ghc-slides.html
http://www.scs.stanford.edu/11au-cs240h/notes/memory-slides.html
(http://www.scs.stanford.edu/11au-cs240h/notes/, http://www.scs.stanford.edu/14sp-cs240h/slides/)
^ В heap profiler-е FUN_* вполне можно иногда увидеть, то есть они динамически генерируются (хотя и тонкой прослойкой, благодаря оптимизациям).
Пример (let ((a 1)) (lambda (b) (+ a b)))
как ((lambda (a) (lambda (b) (+ a b))) 1)
редуцируется до (lambda (b) (+ 1 b))
, так что не пример — нужно чтобы нельзя было редуцировать по месту определения (то что можно редуцировать по месту использования не интересно — в общем случае они не известны).
Типичный пример:
(+)
\x -> (+x)
\x y -> x + y
\x -> \y -> x + y
(не масло масляное, а просто в языке с частичными применениями всё потенциально замыкание)
(defun adder (a) (lambda (b) (+ a b)))
auto adder(int x) { return [=](int y) { return x + y; }; }
или
map (*) -- :: [Int] -> [Int -> Int]
map (\x -> (*x))
map (\x y -> x * y)
map (\x -> \y -> x * y)
\xs -> map (\x -> \y -> x * y) xs
(есть код (*), map (*) возвращает из списка чисел список функций умножающих на эти числа — наверно это будет список замыканий в общем случае)
(defun mm (xs)
(mapcar (lambda (x) (lambda (y) (* x y))) xs))
auto mm(std::vector<int> const& xs) {
std::vector<std::function<int(int)>> rs;
for (int x : xs) rs.push_back([=](int y) { return x * y; });
return rs;
}
Исходная версия quasimoto, :
http://www.scs.stanford.edu/11au-cs240h/notes/ghc-slides.html
http://www.scs.stanford.edu/11au-cs240h/notes/memory-slides.html
(http://www.scs.stanford.edu/11au-cs240h/notes/, http://www.scs.stanford.edu/14sp-cs240h/slides/)
^ В heap profiler-е FUN_* вполне можно иногда увидеть, то есть они динамически генерируются (хотя и тонкой прослойкой, благодаря оптимизациям).
Пример (let ((a 1)) (lambda (b) (+ a b)))
как ((lambda (a) (lambda (b) (+ a b))) 1)
редуцируется до (lambda (b) (+ 1 b))
, так что не пример — нужно чтобы нельзя было редуцировать по месту определения (то что можно редуцировать по месту использования не интересно — в общем случае они не известны).
Типичный пример:
(+)
\x -> (+x)
\x y -> x + y
\x -> \y -> x + y
(не масло масляное, а просто в языке с частичными применениями всё потенциально замыкание)
(defun adder (a) (lambda (b) (+ a b)))
auto adder(int x) { return [=](int y) { return x + y; }; }
или
map (*) -- :: [Int] -> [Int -> Int]
map (\x -> (*x))
map (\x y -> x * y)
map (\x -> \y -> x * y)
\xs -> map (\x -> \y -> x * y) xs
(есть код (*), map (*) возвращает из списка чисел список функций прибавляющих эти числа — наверно это будет список замыканий в общем случае)
(defun mm (xs)
(mapcar (lambda (x) (lambda (y) (* x y))) xs))
auto mm(std::vector<int> const& xs) {
std::vector<std::function<int(int)>> rs;
for (int x : xs) rs.push_back([=](int y) { return x * y; });
return rs;
}