LINUX.ORG.RU

Функции как first-class objects

 


0

0

Про языки, в которых функции можно передавать/возвращать из других функций как значения, традиционно говорят, что в них функции — это объекты первого порядка.

Но int или float я могу сериализовать в файл или в сеть и десериализовать обратно.
Но не в каждом языке с функциями первого порядка я могу проделать то же самое с функциями.

Вам не кажется, что первый порядок какой-то … не совсем первый?



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

А функцию, даже в языке с функциями как объектами первого порядка, не могу.

С чего бы? Можешь, но десериализовывать всё, что получаешь по сети — так себе идея. Это не всегда кроссплатформенно, конечно, но уйма языков из коробки умеют в сериализацию чего угодно.

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

уйма языков из коробки умеют в сериализацию чего угодно.

Немного подправил утверждение.

Да, есть языки, где можно попробовать сериализовать байт-код + environment функции и отправить по сети. Но это можно не во всех языках.

sostupid
() автор топика

Сокет ты тоже не можешь сериализовать и передать по сети (по крайней мере осмысленно). Это не значит, что сокет не является объектом первого порядка. Сериализация не для всего имеет смысл.

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

К функции, как таковой, обычно у тебя доступа прямого тоже нет, а есть адрес (и, иногда, замыкание переменных).

Legioner ★★★★★
()

Онанимус снова выходит на связь?

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

Не совсем верно. Во многих языках, где «всё есть объект», можно сравнить функции в том смысле, это ссылка на один и тот же объект или разные. Сравнить по содержимому функции, конечно, нельзя, но это относится ко многим типам. Потоки ввода-вывода тоже сравнить нельзя.

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

Я, честно говоря, не вижу проблемы.

instance Num b => Num (a -> b) where     
  negate = fmap negate
  (+) = liftA2 (+)
  (*) = liftA2 (*)
  fromInteger = pure . fromInteger 
  abs = fmap abs
  signum = fmap signum
hateyoufeel ★★★★★
()
Ответ на: комментарий от KivApple

Что ты подразумеваешь под содержимым? Исходный код? Это возможно. Байт-код? Тоже возможно. Исходный или байт-код + объект окружения? Не везде, но есть языки где тоже возможно.

anonymous
()

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

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

instance Show (a -> b) where show _ = «<function>»

У тебя не будет соблюдаться

read . show == id

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