LINUX.ORG.RU

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

 


1

1

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

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

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

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



Последнее исправление: new_1 (всего исправлений: 3)

Ответ на: комментарий от forCe

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

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

ты должен проверить не символ, а список

Да ну? Во-первых, там проверяется не символ, а объект. А во-вторых, что мне даст проверка списка? Что '(lambda (x) (+ x x) == '(lambda (x) (+ x x) ? Дальше что?

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

Причем тут площадь, если речь идет о типах.

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

Давай, опиши на своей ахинее значение типа «имеющее площадь».

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

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

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

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

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

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

Ты подтвердил сейчас на все 100 мои предположения о тебе. Впадлу что либо объяснять такому ... Посему откланиваюсь.

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

Во-первых, там проверяется не символ, а объект.

Я не уверен, но насколько я помню, там проверяется идентификатор указывающий на скомпилированный объект функции. Это, в принципе, означает проверку символов.

А во-вторых, что мне даст проверка списка?

Например в этом случае ваш трюк не пройдет: 
(define a (lambda(x) x))
(define b (lambda(x) x))
(write (eq? a b)); --> #f

(define a '(lambda(x) x))
(define b '(lambda(x) x))
(write (equal? a b)); --> #t

Но это отношения к делу, действительно не имеет. Это ведь Вы начали докапываться к синтаксису.

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

Вообще-то градус идиотизма этих диалогов начинает зашкаливать:

А типы там что такое?
Типы это такая фигня у каждого значения, которая говорит что со значением можно делать, а что нельзя.
Типа функцию написали, где от аргумента [площадь](на этом месте могли быть: объем, длина, ширина, е-ная неведомая х-ня, WHATEVER) берется, и теперь нельзя туда передать что-нибудь, от чего [WHATEVER] взять нельзя.
Код соответствует.
Да, но здесь нет WHATEVER ПЛОЩАДИ!!!

И тут, внезапно Вы:

Причем тут площадь, если речь идет о типах.
Типа функцию написали, где от аргумента WHATEVER ПЛОЩАДЬ берется, и теперь нельзя туда передать что-нибудь, от чего WHATEVER ПЛОЩАДЬ взять нельзя.

ПЛОШАДЬ, дайте мне, КОНКРЕТНО, площадь!!!

Что в хаскеле все типы как-то с площадями завязаны?!!

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

Блин, я понял, в общих чертах, что вы там делаете.

Типов я там так и не увидел(можешь ругаться плюсовиком). Там есть проверка на соответствие двух функций.

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

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

Я не уверен, но насколько я помню, там проверяется идентификатор указывающий на скомпилированный объект функции. Это, в принципе, означает проверку символов.

Нет.

(define a (lambda (x) (+ x x)))
(define b a)

(eq?  a  b)
(eq? 'a 'b) ; проверка символов, чтобы это не значило.

Например в этом случае ваш трюк не пройдет:

Какой трюк? Еще раз: что дает

(define a '(lambda(x) x))
(define b '(lambda(x) x))
(write (equal? a b)); --> #t

? Какой из этого вывод? Куда это применить?

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

Во первых, это пример не мой а тса. Я его просто расширил.

Теперь вернись обратно к конкретике и реализуй пример с площадью.

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

Что «такое»? И где не возможно?

В третьих, почему ты докапался до синтаксиса.

Я не докапывался до синтаксиса.

Ты подтвердил сейчас на все 100 мои предположения о тебе. Впадлу что либо объяснять такому ... Посему откланиваюсь.

Т.е. ты признаешь, что написал ахинею и сливаешься? Ок.

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

Код соответствует.

Чему соответствует?

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

foo :: Squarable a => a -> Double

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

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

Еще раз: что дает

Я хз, как уже объяснять, но попробую еще раз. Ваша проверка на эквивалентность с помощью предиката eq? Означает буквально следующее: если два символа связаны с одним и тем же объектом (location), он вернет тру. В вашем примере:

(define a (lambda (x) (+ x x)))
(define b a)
символы a и b указывают на один и тот же объект.

Возникает вопрос. Являются ли процедуры (lambda(x) x) и (lambda(x) x) эквивалентными? Большинство людей, мягко говоря, в здравом уме, дадут положительный ответ. Однако твоя проверка не всегда и не везде покажет эквивалентность. Она покажет ее в том случае, если два символа связаны с одним и тем же объектом.

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

Что касается реализации Вашей площади, если анон не вернется, я напишу может какой-нибудь велосипед, только не сейчас, может вечером, щас дела, некогда. Если вас не затруднит, опишите попроще, что там в вашем коде происходит, я с синтаксисом хаскеля не знаком совершенно.

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

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

Еще раз: что тебе даст твоя проверка?

(equal? '(lambda (x) (+ x x)) '(lambda (y) (+ y y))) ; догадайся о результате и смысле

Если вас не затруднит, опишите попроще, что там в вашем коде происходит, я с синтаксисом хаскеля не знаком совершенно.

Куда уж проще? А с чем ты вообще знаком? Ну давай так:

double foo(Squarable x);

, где

interface Squarable {
    double square();
}
korvin_ ★★★★★
()
Ответ на: комментарий от uhbif19

Спасибо, немного прояснилось. Я так и предполагал, в принципе.

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