Shub
Это какие например?
кэширование файловой системы по 10 минут
Anonymous
Привет всем! продолжаю исследовать F#. Созрел вопрос. Почему так?
Anonymous
Аналог на языке D2 такого не позволяет.
Pavel
by design
Anonymous
Выдержка из книги Александреску "Язык Программирования D"
Pavel
а сам нет a <- [|1|] не проканает
Anonymous
функциональное программирование - все есть данные
Anonymous
Если a данные, то a не должно меняться. т.к. let a - иммутабельно
Pavel
а не мутабельно. его поля в данном случае через индекс мутабельные. в классах тоже бывают мутабельные проперти. обеспечивается совместимость с .net типами проблема то с чем?
Pavel
хочешь немутабельности элементов - let a = [1;2;3]
Anonymous
Как же нет, let x = используется и для данных и для функций, т.к. функции это первоклассные данные(поправьте, если ошибаюсь)
Anonymous
let f1 x = x * x, let f2 = 2 f1 - точно функция, f2 -- возможно, т.к. с одной стороной она ничего не вычисляет, т.к. хранит готовое значение(как данные), но с другой возвращает 2 (как функция)
Pavel
@omgszer кстати не зашел твой нугет. слишком много зависимостей. хотел стримы на анроиде посмотреть - но он от зависимостей так охренел что забыл что int это типа данных
Ayrat
Не для общего пользования)
Pavel
печаль
Ayrat
Я думал тебе посмотреть надо, а не в прод тащить
Pavel
ну посмотреть прикольно конечно тоже, но тут снова аналогия между виртуальными и раельными вименами )
Ayrat
На самом деле, выделить в нугет и запаблишить полчаса работы. Сделаю сегодня
Ayrat
Пул реквест делать гораздо дольше
Ayrat
В гопак
Pavel
Как же нет, let x = используется и для данных и для функций, т.к. функции это первоклассные данные(поправьте, если ошибаюсь)
функциональное программирование оно про функции и их композиции. а какие там данные и мутабельные ли они уже третий вопрос. это офицальная позиция хаскелистов
Pavel
На самом деле, выделить в нугет и запаблишить полчаса работы. Сделаю сегодня
я конечно могу ошибаться, но думаю многим (мне то точно) было б интересно посмотреть как под капотом сие устроено. в исходниках т.е. ) если пулл долго может просто в гист бросишь?
Anonymous
согласен, но хотелось бы гарантий от комплятора, что данные не изменятся
Anonymous
данные не должны менятся, но лишь преобразовываться этими самыми функциями к другому виду
Pavel
согласен, но хотелось бы гарантий от комплятора, что данные не изменятся
компилятор гарантирует что в списке элементы незменны, в массиве могут изменяться. это соглашение о структурах.
Roman
согласен, но хотелось бы гарантий от комплятора, что данные не изменятся
хочешь иммутабельную коллекцию - использую List: let a = [1;2;3] Там ты изменить не сможешь элемент (но если сам элемент имеет мутабельные проперти — их таки можно будет мутировать) Если ты будешь пользоваться рекордами, DU и фшарповыми коллекциями List, Set, Map, то будет тебе иммутабельность полная. Массив [|a; b|] — это стандартный дотнетовский массив. Фшарп существует не в вакууме, а в платформе, отсюда тебе и мутабельность
Anonymous
функциональное программирование оно про функции и их композиции. а какие там данные и мутабельные ли они уже третий вопрос. это офицальная позиция хаскелистов
из этого определения следует, что данные неизменяемые (на вход одни, на выходе другие), если же данные мутабельны, то нет гарантии, что функция вернет верное значение, и комплятор в данном случае нас не защищает. Понятно, что это ограничение платформы, но в D это же реализовано.
Anonymous
Т.е. если функция принимает массив, значит она уже не чистая?
Anonymous
массив можно изменить в другом потоке
Roman
функция чистая, если она не имеет сайдэффектов (работа с IO, мутация чего бы то ни было за пределами функции)
Roman
Anonymous
пример sum arr = ...
Pavel
Т.е. если функция принимает массив, значит она уже не чистая?
чистота функции зависит не от того что она принимает а от того что она с этим делает
Anonymous
[|1,2,3|] |> sum вернет 6 если поток один
Anonymous
если параллельно кто-то изменит 2 на 3, то функция [|1,2,3|] |> sum вернет 7, а не 6
Roman
массив изменил кто-то другой, функция тут не при чем
Vladislav
(Не использовать дотнет массивы все ещё вариант)
Anonymous
определение функции гласит, что один и тот же аргумент всегда выдает один и тот же результат
Anonymous
не принимать на вход мутабельные структуры
Vladislav
Ну я могу передать массив и вернуть его, ничего не сделав с ним.
Anonymous
а что она возвращает?
Pavel
случайную величину обычно
Anonymous
если результат - случайное число, то ок, пусть будет такая функция
Pavel
аргумент то неизменный - результат разный. это функция? если да то твое определение неверно
Anonymous
если сделать интеграционный тест рэндом, то в идеале должно быть всегда случайное число(равномерное распределение), иначе в функции ошибка
Anonymous
логика соблюдается
Pavel
причем тут тест. мы про определение функции говорим
Anonymous
аргумент то неизменный - результат разный. это функция? если да то твое определение неверно
В отличии от рэндом, sum всегда должен быть равен сумме элементов
Anonymous
это пропертибейз вроде как тестирование
Pavel
он и равен. на момент суммированиядля всех элеменов что у тебя в массиве он дает точный результат
Roman
значит random это не функция?
не чистая функция
Pavel
не чистая функция
это детали. в определении они отсуствуют
Roman
Имхо мы какую-то хуйню обсуждаем. Демагогия сплошная
Pavel
с D всегда так
Pavel
но не тех что поданы на вход
ты ее threadsafe сделай потом обсудим
Anonymous
ты ее threadsafe сделай потом обсудим
мы вернулись к тому, что let a = создает иммутабельное значение, главная плюшка фп
Pavel
точнее фп это не про нее
Anonymous
но по сути - да, т..к. отутствие состояния которое требуется иногда менять и есть иммутабельность
Roman
ФЛУД
это не оправдывает демагогию, во флуде просто шире спектр обсуждаемых тем
Anonymous
Да, ладно!
Vasily
Кароч, Склифосовский. Суть спора от меня ускользает, но попахивает демагогией и прочей хуйней.Я понятно выражаюсь, Alex ?
Ayrat
Вообще вы чот реально хуйню обсуждаете. Тот же рандом можно сделать чистой функцией. Монадой Random АХАХАХАХАХАХ
Ayrat
val getRandom: unit -> Random<int> ресолвить по месту, поперчить по вкусу
Ayrat
функция - чистее слезы девственницы
Anonymous
Кароч, Склифосовский. Суть спора от меня ускользает, но попахивает демагогией и прочей хуйней.Я понятно выражаюсь, Alex ?
Кому как. Для меня вопрос имеет смысл. Понятно, что массивы нужны. Но можно ж было как-то отделить от иммутабельных структур, что-то типа ref / := / ! Ок, замнем для ясности
Ayrat
В скале из-за той же проблемы есть серые зоны