All streams
Search
Write a publication
Pull to refresh
131
0
Egor Malykh @devpony

User

Send message
На мобильные платформы отлично бы зашла. Как с этим у дельфей?

Наоборот! Вдруг я ошибся и определённая мной операция выводит за пределы установленного множества? Тогда я хочу получить ошибку компиляции, а не исполнения. Если мои операции намеренно выводят за границы установленного множества, то какой в этом множестве тогда смысл? Я лучше буду просто использовать 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».

Очень распространённая, однако в корне неверная точка зрения. Признаюсь и сам так считал, пока курс философии в университете не расставил всё на свои места.


Философия — основа любой науки. Почти все знаменитые математики были философами. Там, где кончаются границы применимости науки, вы встретите лишь философские концепции. Философия оперирует понятиями гораздо более мощными, выразительными и абстрактными, чем любой раздел науки. Более того, наука и философия ещё с античных времён тесно переплетены и представляют собой разные формы человеческого познания, каждое из которых невозможно без второго. Их разделять нельзя.


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

И вообще, почему не на гиктаймсе? Там хабы по красоте названия легче подбирать.

Господи, ну при чём тут функциональное программирование?

data Image = Image Width Height [[Int]]

rotate :: Image -> Image
rotate (Image (Width w) (Height h) xs) = Image (Width h) (Height w) $ transpose xs
Все, все, ухожу. Представляю, какая космическая скорость разработки у вас, если на каждый чих нужно пару типов объявить.

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


И в базе так же лежат, дайте угадаю, сериализованные вместе с типами, да?

Ну можно и с типами, если очень хочется. Правда не совсем понимаю, какое это отношение имеет к обсуждаемой теме.

newtype Title = Title String
newtype Width = Width Integer
newtype Height = Height Integer

showWarning :: Width -> Height -> Title -> String -> a
showWarning (Width width) (Height height) (Title title) contents = undefined

main = showWarning 1 2 (Title "Title") "Content"

-- No instance for (Num Width) arising from the literal ‘1’

main = showWarning (Height 1) (Width 2) (Title "Title") "Content"

-- Couldn't match expected type ‘Width’ with actual type ‘Height’

main = showWarning (Width 1) (Height 2) (Title "Title") "Content"

-- Ok

Information

Rating
Does not participate
Location
Berlin, Berlin, Германия
Registered
Activity