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