Pull to refresh

Comments 29

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

И это просто прекрасно. Код из-за этого читается легко и приятно.
АмнекажетсянаоборотэтоубиваетчитаемостькодаЭтокакеслибыпредложениявсегдабылизаписанысплошнякомбезпробеловипрочихзнаковпрепинанияРазделителидлятогоипридумаличтобыглазуивконечномсчетемозгубылолегчевыделятьинформациюизпотокаУверенвамстоилогораздоольшихтрудовчтобыпрочитатьэтопредложениечемеслибыонобылозаписанотак
Не открывать без прочтения вышеизложенного!
Я предупреждал
А мне кажется, наоборот, это убивает читаемость кода. Это как если бы предложения всегда были записаны сплошняком, без пробелов и прочих знаков препинания. Разделители для того и придумали, чтобы глазу (и в конечном счете, мозгу) было легче выделять информацию из потока. Уверен вам стоило гораздо больших трудов, чтобы прочитать это предложение, чем если бы оно было записано так: (кстати, в сплошном тексте грамматическая ошибка. Найдите ее за 10 секунд)

((Ну) (мы же) (про) (скобки и запятые)), ((а не про) пробелы).
К *тому (гр, амм, ати, че, скую) [ошибку] [легко] #найдет $$компилятор.
Чем они принципиально отличаются? Или вы думаете, что читать книгу (текст на 10000 знаков, для определенности) без знаков препинания будет комфортно?
К *тому (гр, амм, ати, че, скую) [ошибку] [легко] #найдет $$компилятор.

Что делать, если компилятора нет, а ошибку исправить надо?
Хаскел принципиально отличается тем, что я могу написать bind(), а могу >>. Условностей в синтаксисе минимум. Ну и отступы, которые обязательны, хорошо помогают читать короткие строки по 2-3 слова. Можно записать все в одну строчку, но я в реальной жизни таких уникумов не встречал. Практически все пишут простой и понятный код. Ну если монадами не злоупотреблять.
Сравните

main = putStrLn «hello»

и

def main():
print «Hello»

Во втором случае «бесполезных» символом куда как больше. А читаемость ниже.
Никто не говорит, что в Хаскеле нет знаков препинания.
Ими являются правильные отступы и… скобки.
Пробелы приводят лишь к тому, что использовать в названиях подчёркнутый_стиль крайне не рекомендуется, так как легко спутать с пробелом.
Лично мне нравится аналогия с командной строкой, то есть когда синтаксис вызова функции соответствует принципу, по которому мы выполняем команды в cli. В таком представлении, скобки выполняют естественную роль границ выражения, а не служат в качестве специального символа-разделителя между именем функции и её аргументами. Сравните гипотетический cat, схожий с одноименной утилитой в Unix:

cat file1.txt file2.txt

cat "file1.txt" "file2.txt"

cat("file1.txt", "file2.txt")


Очевидно, что в последнем примере скобки не несут никакой смысловой нагрузки, а являются специальными парными символами-разделителями, которые упрощают жизнь разве что только лексеру языка, но не программисту.
Теории тут много, но хорошо сказано про то, что такое моноиды!
А что такое вещи, большие чем множества?
Например, не может быть множества всех множеств и подобных, от этого возникают парадоксы. В то же время, категория всех категорий никаких парадоксов не создает, зато в нее явно входят все множества, плюс такие категории, объекты которых тоже не формируют множества. Так что, она «очевидно» больше, чем любое множество. В каком-то смысле.
Да, парадокс множества всех множеств порождается неформальностью определения множества.
Если дать формальное определение, то понятие «множество всех множеств» просто нельзя будет описать, т.е. будет противоречить определению множества. IMHO.
В мире множеств есть лишь 3 мощности — конечное, счетное бесконечное и континуум. Сравнивать мощности множеств и категорий, на мой взгляд, не вполне корректно
Вы категорически не правы, мощностей, конечно, бесконечность, никто не знает даже, счетная ли.
Можете привести пример другой мощности, кроме упомянутых?
Да, множество функций f: R -> R имеет мощность больше континуума (есть доказательство).
В общем случае, множество функций g: A -> A имеет строго большую мощность, чем множество A.
Спасибо, был пробел в знаниях!
Извините, я никак не могу понять про моноид. Если можете, объясните на конкретном примере, что именно является объектом, что — стрелкой.

Вот у нас есть категория одного объекта. Я правильно понимаю, что объект — это сам моноид, а стрелка — это все его отображения в себя?
Если все так, то какие есть отображения моноида в себя, кроме тривиального?
Во-первых, не отображение моноида в себя. Теоретико-множественный моноид состоит из множества, фиксированного элемента этого множества и операции m: X -> X -> X. Так что, в себя отображается не моноид, а множество моноида.
Во-вторых, очень просто, если ваш моноид — целые числа, то для любого числа n функция
f x = x + n 

будет отображением множества моноида в себя (тут m = +).
Теоретико-категориальный моноид никуда не отображается, а имеет множество морфизмов, которое изоморфно множеству вышеупомянутых функций, которое, в свою очередь, изоморфно множеству теоретико-множественного моноида.
И нас, получается, не беспокоит, что отображение не «на», а «в», и что в частности может после такого отображения легко может пропасть ноль? Мы не пытаемся из нового множества снова сделать моноид?

«Теоретико-категорный морфизм имеет множество морфизмов». Морфизмов чего и во что? Я правильно это себе представляю, что объект — это множество моноида, а стрелка — это все его морфизмы. И объект плюс стрелка являются теоретико-категорным моноидом?
Да не отображаем мы ничего никуда в ТК. Мы просто умеем компоновать морфизмы в новые морфизмы. А стрелка — это просто другое название морфизма. И не морфизм имеет морфизмы, а моноид. Вы невнимательно прочитали. А морфизмы из себя в себя. Автор же так и написал.
Ок. Т.е. нас вообще не волнует, что из себя представляет объект, что из себя представляют стрелочки, лишь бы компоновались?
Возможно, вам стоит почитать весь цикл с начала. Вот этот ваш комментарий — это, по сути, неформальное определение категории, которое было еще в первой статье, а вы так написали, как-будто удивились.
Я читал ваш цикл с начала и даже несколько часов медитировал над википедией. Но видимо я еще не вполне смирился с тем, что объект и морфизм не обязаны нести какой-либо смысл. Особенно учитывая, что бывают «нормальные» категории типа категорий множеств, где известна природа объектов.
Тео́рия катего́рий — раздел математики, изучающий свойства отношений между математическими объектами, не зависящие от внутренней структуры объектов.
Что совершенно не мешает теоркатегорщикам постоянно говорить о категориях таких-то объектов и сяких-то объектов.
Да, в качестве примеров и аналогий для лучшей интуиции формализмов.
В конце статьи я немного поплыл в абстракциях. :-)
Надо будет еще раз внимательнее расставить точки над i.
P.S. Было бы неплохо в начале статьи (или отдельной статьей) предоставлять глоссарий терминов, которые вы же сами определяли. Мне в свое время очень помогало в освоении универовской программы. :-)
Самое главное, что удалось почерпнуть — это понимание того, каким образом математики занимаются рукоблудием ;)
А если серьезно, то то, что Haskell — это не средство приобщить программистов к математике, а приобщить математиков к программированию.
Haskell — это инструмент отладки мышления. (я не помню кто автор этого утверждения)
Sign up to leave a comment.

Articles