LINUX.ORG.RU

Нет присваивания.

 


1

1

Не силен в функциональной парадигме, пытаюсь сейчас вникнуть. На одном из сайтов нашел такое определение:

В чистом функциональном программировании оператор присваивания отсутствует, объекты нельзя изменять и уничтожать, можно только создавать новые путем декомпозиции и синтеза существующих

В связи с этим вопрос: является ли такое определение присваиванием с точки зрения ФП:

(define a (let ((x 1)) (lambda(y) (x y))))



Последнее исправление: new_1 (всего исправлений: 3)
Ответ на: комментарий от Artificial_Thought

А чистые функции называют чистыми, только потому что у них свой скоп и они не лезут в глобальный скоп так что-ли?

new_1
() автор топика
Ответ на: комментарий от new_1

Чистыми функциями, грубо говоря, которые принимают на вход определённые значения и всегда возвращают одно и то же значение при этих же входных значениях.

Artificial_Thought ★★★★
()
Ответ на: комментарий от Artificial_Thought

Ну, технически, наверное, это как раз реализуется, засчет собственного скопа который неизменяем (или иммутабелен)?

new_1
() автор топика
Ответ на: комментарий от Artificial_Thought

А тогда монады - это обертки, которые позволяют «миксовать» переменные в скопах двух или более функций, как бы соединять несколько скопов в один (извиняюсь за назойливость)?

new_1
() автор топика
Ответ на: комментарий от new_1

нет. В терминологии хаскелла монада - это «обёртка» над действиями, приводящими к побочным эффектам.

anonymous
()
Ответ на: комментарий от new_1

А монады - это моноидальные объекты в категории эндофункторов.

anonymous
()
Ответ на: комментарий от new_1

Типы это такая фигня у каждого значения, которая говорит что со значением можно делать, а что нельзя.

P.S. А монада не обертка над дейтсвием с побочным эффектом. Побочные эффекты только частный случай монад.

Kakadu
()
Ответ на: комментарий от Kakadu

Типы это такая фигня у каждого значения, которая говорит что со значением можно делать, а что нельзя.

Выходит, типы в хаскеле, это что-то вроде этого?

(define sum '(lambda(x) (+ x x)))
(define mul '(lambda(x) (* x x)))
(define sum-f? (lambda(x) (equal? x sum)))
(define value (let ((one 1)) (lambda(f) (if (sum-f? f) (apply (eval f) (list one)) (error "error type!")))))

(write (value sum));  --> 2
(write (value mul));  --> ERROR: error type!

new_1
() автор топика
Ответ на: комментарий от new_1

Да нет. Я не знаток лиспа, но вы тут функции на равенство проверяете (типа, то, что передали должно быть функцией sum), а там пространство типов немного отдельно от значений. Типа функцию написали, где от аргумента площадь берется, и теперь нельзя туда передать что-нибудь, от чего площадь взять нельзя.

Лучше попробуйте какой-нибудь язык, Haskell, OCaml. Я хз как это объяснить. Вначале будет казаться, что компилятор постоянно бьет по рукам, но если осилите — сами поймете.

Kakadu
()
Последнее исправление: Kakadu (всего исправлений: 1)
Ответ на: комментарий от new_1

Выходит, типы в хаскеле, это что-то вроде этого?

Это из разряда «Рабинович по телефону напел». Лучше взять любую книжку по хаскелу и прочитать первые 10 страниц.

ratatosk
()
Ответ на: комментарий от anonymous

В терминологии хаскелла монада - это «обёртка» над действиями, приводящими к побочным эффектам.

Нифига. В терминологии хаскелла (и не только) монада - это (полиморфный) тип данных, на котором заданы определенные операции, обладающие определенными свойствами.

ovk48 ★★★
()
Последнее исправление: ovk48 (всего исправлений: 1)
Ответ на: комментарий от Kakadu

Типа функцию написали, где от аргумента площадь берется, и теперь нельзя туда передать что-нибудь, от чего площадь взять нельзя.

Ну и как Вы передадите здесь неверный тип:


(define sum '(lambda(x) (+ x x)))
(define mul '(lambda(x) (* x x)))
(define sum-f? (lambda(x) (equal? x sum)))
(define mul-f? (lambda(x) (equal? x mul)))
(define value (let ((one 1)) (lambda(f) (if (sum-f? f) (apply (eval f) (list one)) (error "error type!")))))
(define value2 (let ((one 1)) (lambda(f) (if (mul-f? f) (apply (eval f) (list one)) (error "error type!")))))

(define only-sum-type-function
  (lambda(value) (value sum)))

(write (only-sum-type-function value)); --> 2
(write (only-sum-type-function value2)); --> ERROR: error type

anonymous
()
Ответ на: комментарий от anonymous

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

anonimous
()
Ответ на: комментарий от ratatosk

Лучше взять любую книжку по хаскелу и прочитать первые 10 страниц.

Ага, первые 10 страниц, как-раз, вынесут мозг безвозвратно, и ты пойдешь зубрить илитарный теокат и остальное Г.

anonimous
()
Ответ на: комментарий от KblCb

Забавно и даже в чём-то похоже на правду, но нет.

А что не так?

anonimous
()
Ответ на: комментарий от mentalmenza

Забавный факт, я смотрел как-то лекции сикп, уже где-то по 4 главе, нааверное, и там Сассман отвечает на ворос студента чем же все-таки отличается let от define. Просто феерично.

anonimous
()
Ответ на: комментарий от anonymous

Интересно, получается, ты в паре строчек имплементировал божество хаскелистов - type theory, и тем самым сломал им мозг.

anonymous
()

Я бы сказал, что в чистых функциональных языках нет не «присваивания», а «переприсваивания». Хотя, действительно, более правильно называть это привязкой, а не присваиванием.

geometer
()
Ответ на: комментарий от new_1

Все правильно, просто хомячье не понимает простых вещей. Цель всего этого, заставить их писать подобный код «принудительно». Пусть даже они и не понимают, что происходит на самом деле, благодаря хаскелю, они будут писать все равно «правильно».

anonymous
()
Ответ на: комментарий от geometer

Я бы сказал, что в чистых функциональных языках нет не «присваивания», а «переприсваивания».

Нет, ну под «переприсваиванием» как раз и понимается термин присваивание. В противном случае - это свзывание. Но концептуальной разницы, которую нам постоянно пытаются навязать, тут нет. Весь вопрос - в применении. В js, например, все неопределенные значения - undefined, Получается, что связывание - это присваивание переменной со значением undefined другого значения. То же «переприсваивание», вид сбоку.

anonymous
()

Я только хочу предупредить, чтобы вы критически относились к постам анонимусов и людей с подобными никами. У них то статическа типизация не годится из-за теоремы о неполноте, то металлика — попса.

Kakadu
()
Ответ на: комментарий от Kakadu

Это же ваше определение типов?

Типа функцию написали, где от аргумента площадь берется, и теперь нельзя туда передать что-нибудь, от чего площадь взять нельзя.

Получается, вякнули, а ответить нечего, кроме того, что металлика - непопса.

anonymous
()

Да, присваивания нет, но есть ссылки IORef, которые можно изменять (внутри вычисления IO).

dave ★★★★★
()
Ответ на: комментарий от Kakadu

да, но напомню, что здесь вопрос не в компиляции, а в теоретическом понимании. Именно этого хочет ТС

anonymous
()
Ответ на: комментарий от anonymous

да, но напомню, что здесь вопрос не в компиляции, а в теоретическом понимании. Именно этого хочет ТС

Давай-ка, анончик, ты сейчас расскажешь нам, как этот код работает, потому как читать ваше скобьё никому не хочется.

А потом мы поговорим о типах, теоретическом понимании и прочих всяких вещах.

RedPossum ★★★★★
()
Ответ на: комментарий от anonymous

да ты про весь в общих чертах

и особенно вот про это

(define value (let ((one 1)) (lambda(f) (if (sum-f? f) (apply (eval f) (list one)) (error «error type!»)))))

RedPossum ★★★★★
()
Ответ на: комментарий от RedPossum

Ну, в общих чертах сначала определяем две функции, которые в рантайме потом скомпилируются. Ваш пример - это данные определенного типа в виде функции, которая падает, если тип функции переданный ей в качестве параметра не соответствует заявленному типу. Дальше определена хашкель-функция которая берет в качестве параметра хашкель-тайп-данные. Как-то так.

anonymous
()
Ответ на: комментарий от Kakadu

Стадия компиляции, с этой точки зрения, не слишком принципиальна. Не думаю, что каждый программер пишущий на хаскеле, пишет свой компилятор, или детально изучает существующий. Когда он пишет - он делает именно это - думает о типах как о безумной уличной магии, хотя они - банальность.

anonymous
()
Ответ на: комментарий от Kakadu

Опять же, речь шла о вашем определении типов:

Типа функцию написали, где от аргумента площадь берется, и теперь нельзя туда передать что-нибудь, от чего площадь взять нельзя.

Данный код соответствует вашему определению, поэтому не надо отмазыватся и пинать на копиляцию. Да и код ТСа, против которого Вы привели данное определение в качестве «опровержения», вполне подпадает под это определение. Так что не надо вводить людей в заблуждение.

anonymous
()
Ответ на: комментарий от anonymous

И здесь еще, в гребанных компилирующихся современных недолиспах, приходится писать кучу лишних eval apply, а в тру-лиспах, где code-as-data, это еще на порядок проще.

anonymous
()
Ответ на: комментарий от RedPossum

Та это просто ахинея, которая по-человечески пишется так:

(define (sum x) (+ x x))
(define (mul x) (* x x))

(define (value f)
  (if (eq? f sum)
      (f 1)
      (error "shit")))

(define (value2 f)
  (if (eq? f mul)
      (f 1)
      (error "shit")))

(define (only-sum-type-function value)
  (value sum))

(write (only-sum-type-function value))
(write (only-sum-type-function value2))

Впрочем меньшей ахинеей оно от этого не становится. И главное никакого отношения к типам. Анонимус просто нагородил огород, чтобы выглядело «позаумней».

korvin_ ★★★★★
()
Ответ на: комментарий от Kakadu

Причем тут площадь, если речь идет о типах. Вам что простыню именно с площадью накатать что-ли?

anonymous
()
Ответ на: комментарий от korvin_

Во первых, плюсовичек, ты должен проверить не символ, а список, и в общем случае, ты не проверишь скомпилированную функцию по ее имени, что ты здесь и пытаешься сделать. Но если отбросить эти тонкости, твой вариант сойдет в демонстративных целях. А по поводу того, что ты не видишь тут типов, это потому, что у тебя плюсы головного мозга, тут уже медицина бессильна.

anonymous
()
Ответ на: комментарий от anonymous

В терминологии хаскелла монада - это «обёртка» над действиями, приводящими к побочным эффектам.

В хаскеле вроде нет побочных эффектов.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.