Наоборот! Вдруг я ошибся и определённая мной операция выводит за пределы установленного множества? Тогда я хочу получить ошибку компиляции, а не исполнения. Если мои операции намеренно выводят за границы установленного множества, то какой в этом множестве тогда смысл? Я лучше буду просто использовать Integer, или хотя-бы явное приведение типов.
Или, например, взять все чётные числа {2n | n <- Z} и определить операции сложения и вычитания естественным образом. Получим коммутативное ассоциативное кольцо, чьими свойствами сможем в полной мере пользоваться и знать, что все операции с нашим типом безопасны и не выведут из множества чётных чисел.
Можно рассмотреть бесконечное множество типов и соответствующих структур, но лишь некоторые из них будут полезны и безопасны на практике. Об этом нужно думать при проектировании системы и с этим должен помогать язык программирования.
Всё зависит от того, какое подмножество взять и как определить на нём разность. Если, например, взять множество {0..n}, а разность определить как разность по модулю, получим кольцо вычетов — красивую и полезную на практике структуру.
1) Если мы вводим тип с ограниченным набором значений, мы, скорее всего, делаем это не просто так а с вполне определённой целью: мы хотим, чтобы любая переменная данного типа содержала значения только из заданного интервала. Очевидно, что и операции над такими переменными должны иметь вполне определённый смысл. Иначе зачем вообще вводить собственный тип, ведь можно использовать Integer?
2) Хорошо, когда тип данных образует некоторую математическую структуру с доказанными свойствами. Тогда производить операции над этим типом становится просто и приятно, а рассуждать о программе — легче. В любом другом случае ограничения становятся искусственными, а свойства — некрасивыми и не очевидными. Это приведёт только к большему числу ошибок.
Тем не менее, чему будет равно a - b, если обе переменных типа Age и равны 120? Я не хочу каждый раз писать тонну условий, я хочу, чтобы язык предоставлял удобные и безопасные типы, тем более когда его систему типов так расхваливают.
Я не очень понял, как вы определили операции сложения и вычитания на множестве {1..120}, ведь они не замкнуты на нём. Кольцом вычетов оно тоже не является, так как не содержит нуля. Если операции выводят из множества, то в чём тогда вообще смысл этого типа данных? Чему будет равно a - b, если обе переменных типа Age и равны 120?
Уж лучше вообще ничего не объяснять, чем объяснять всё некой магией, которая дана нам свыше и с помощью божественной силы может "поднимать" монады и "преобразовывать" IO String в String. Нужно понимать как работает твой инструмент, на какую математику он опирается, во что преобразуется do нотация, что такое монады и зачем вообще они нужны, а не просто бездумно их использовать. Иначе чем это лучше Карго-культа?
К тому же в статье всё изложено бегло и скомкано, не приведено никаких примеров. Статья рассчитана на абсолютных новичков, однако изобилует сложными терминами. Половина кода в мыльных картинках, половина не подсвечена. Не знаю, к чему стремился автор, но желанием помочь новичкам он точно не горел.
Вот пример как нужно объяснять монады новичкам, не теряя при этом важных деталей, не используя сложных терминов и не скатываясь в объяснение через магическую силу.
Мне кажется, пора начать различать data scientist и data engineer.
Первые — прикладные математики с серьёзным образованием, исследующие науку о данных, разрабатывающие новые алгоритмы, формализующие нейронные сети как операторы в Хаусдорфовом пространстве и т.д.
Вторые пришли в индустрию ради заработка, вспомнили теорвер из универа, прочитали пару свежих книжек, знают границы применимости каждого метода и успешно решают поставленные бизнес-задачи.
Первым всегда будет чем заняться, труд вторых, конечно, можно будет отчасти автоматизировать, но никогда не полностью. Всегда будут появляться новые методы, алгоритмы, подходы. К тому же, всегда крайне важным будет экспертное понимание предметной области и природы данных, понимание целей заказчика и умение быстро этих целей достигнуть, чего не сделаешь полностью автоматизированными методами.
Ну, то, как появился человек, планета и все дела — это пытаются выяснить ученые. Философы же, в основном, выдают ответы, по ценности не превосходящие «потому что 42».
Очень распространённая, однако в корне неверная точка зрения. Признаюсь и сам так считал, пока курс философии в университете не расставил всё на свои места.
Философия — основа любой науки. Почти все знаменитые математики были философами. Там, где кончаются границы применимости науки, вы встретите лишь философские концепции. Философия оперирует понятиями гораздо более мощными, выразительными и абстрактными, чем любой раздел науки. Более того, наука и философия ещё с античных времён тесно переплетены и представляют собой разные формы человеческого познания, каждое из которых невозможно без второго. Их разделять нельзя.
Проблема разума, проблема познания и познаваемости, проблема истины — проблемы философии, никакой раздел науки не может и никогда не сможет их решать, исходя из самого определения науки, как познания сугубо эмпирического, обусловленного трансцендентальными формами. Наука лишь конструирует систематические знания, описывая феномены, данные нам в ощущениях от трансцендентных объектов, а сами они непознаваемы.
Все, все, ухожу. Представляю, какая космическая скорость разработки у вас, если на каждый чих нужно пару типов объявить.
Мне — не нужно. У автора поста возникла проблема. Я утверждаю, что фундаментально это проблема не синтаксиса, а типизации и показываю как бы автор мог её решить на статически типизированном языке.
И в базе так же лежат, дайте угадаю, сериализованные вместе с типами, да?
Ну можно и с типами, если очень хочется. Правда не совсем понимаю, какое это отношение имеет к обсуждаемой теме.
Наоборот! Вдруг я ошибся и определённая мной операция выводит за пределы установленного множества? Тогда я хочу получить ошибку компиляции, а не исполнения. Если мои операции намеренно выводят за границы установленного множества, то какой в этом множестве тогда смысл? Я лучше буду просто использовать
Integer
, или хотя-бы явное приведение типов.Или, например, взять все чётные числа
{2n | n <- Z}
и определить операции сложения и вычитания естественным образом. Получим коммутативное ассоциативное кольцо, чьими свойствами сможем в полной мере пользоваться и знать, что все операции с нашим типом безопасны и не выведут из множества чётных чисел.Можно рассмотреть бесконечное множество типов и соответствующих структур, но лишь некоторые из них будут полезны и безопасны на практике. Об этом нужно думать при проектировании системы и с этим должен помогать язык программирования.
Всё зависит от того, какое подмножество взять и как определить на нём разность. Если, например, взять множество
{0..n}
, а разность определить как разность по модулю, получим кольцо вычетов — красивую и полезную на практике структуру.1) Если мы вводим тип с ограниченным набором значений, мы, скорее всего, делаем это не просто так а с вполне определённой целью: мы хотим, чтобы любая переменная данного типа содержала значения только из заданного интервала. Очевидно, что и операции над такими переменными должны иметь вполне определённый смысл. Иначе зачем вообще вводить собственный тип, ведь можно использовать Integer?
2) Хорошо, когда тип данных образует некоторую математическую структуру с доказанными свойствами. Тогда производить операции над этим типом становится просто и приятно, а рассуждать о программе — легче. В любом другом случае ограничения становятся искусственными, а свойства — некрасивыми и не очевидными. Это приведёт только к большему числу ошибок.
Тем не менее, чему будет равно
a - b
, если обе переменных типаAge
и равны 120? Я не хочу каждый раз писать тонну условий, я хочу, чтобы язык предоставлял удобные и безопасные типы, тем более когда его систему типов так расхваливают.Я не очень понял, как вы определили операции сложения и вычитания на множестве
{1..120}
, ведь они не замкнуты на нём. Кольцом вычетов оно тоже не является, так как не содержит нуля. Если операции выводят из множества, то в чём тогда вообще смысл этого типа данных? Чему будет равноa - b
, если обе переменных типаAge
и равны 120?Уж лучше вообще ничего не объяснять, чем объяснять всё некой магией, которая дана нам свыше и с помощью божественной силы может "поднимать" монады и "преобразовывать"
IO String
вString
. Нужно понимать как работает твой инструмент, на какую математику он опирается, во что преобразуется do нотация, что такое монады и зачем вообще они нужны, а не просто бездумно их использовать. Иначе чем это лучше Карго-культа?К тому же в статье всё изложено бегло и скомкано, не приведено никаких примеров. Статья рассчитана на абсолютных новичков, однако изобилует сложными терминами. Половина кода в мыльных картинках, половина не подсвечена. Не знаю, к чему стремился автор, но желанием помочь новичкам он точно не горел.
Вот пример как нужно объяснять монады новичкам, не теряя при этом важных деталей, не используя сложных терминов и не скатываясь в объяснение через магическую силу.
Два телефона теперь носить?
Гиктаймс там ->
Мне кажется, пора начать различать data scientist и data engineer.
Первые — прикладные математики с серьёзным образованием, исследующие науку о данных, разрабатывающие новые алгоритмы, формализующие нейронные сети как операторы в Хаусдорфовом пространстве и т.д.
Вторые пришли в индустрию ради заработка, вспомнили теорвер из универа, прочитали пару свежих книжек, знают границы применимости каждого метода и успешно решают поставленные бизнес-задачи.
Первым всегда будет чем заняться, труд вторых, конечно, можно будет отчасти автоматизировать, но никогда не полностью. Всегда будут появляться новые методы, алгоритмы, подходы. К тому же, всегда крайне важным будет экспертное понимание предметной области и природы данных, понимание целей заказчика и умение быстро этих целей достигнуть, чего не сделаешь полностью автоматизированными методами.
Не только в заголовке..
Замечательно, большое спасибо :)
Очень распространённая, однако в корне неверная точка зрения. Признаюсь и сам так считал, пока курс философии в университете не расставил всё на свои места.
Философия — основа любой науки. Почти все знаменитые математики были философами. Там, где кончаются границы применимости науки, вы встретите лишь философские концепции. Философия оперирует понятиями гораздо более мощными, выразительными и абстрактными, чем любой раздел науки. Более того, наука и философия ещё с античных времён тесно переплетены и представляют собой разные формы человеческого познания, каждое из которых невозможно без второго. Их разделять нельзя.
Проблема разума, проблема познания и познаваемости, проблема истины — проблемы философии, никакой раздел науки не может и никогда не сможет их решать, исходя из самого определения науки, как познания сугубо эмпирического, обусловленного трансцендентальными формами. Наука лишь конструирует систематические знания, описывая феномены, данные нам в ощущениях от трансцендентных объектов, а сами они непознаваемы.
И вообще, почему не на гиктаймсе? Там хабы по красоте названия легче подбирать.
Господи, ну при чём тут функциональное программирование?
Мне — не нужно. У автора поста возникла проблема. Я утверждаю, что фундаментально это проблема не синтаксиса, а типизации и показываю как бы автор мог её решить на статически типизированном языке.
Ну можно и с типами, если очень хочется. Правда не совсем понимаю, какое это отношение имеет к обсуждаемой теме.