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
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.