LINUX.ORG.RU

Сила Haskell

 ,


0

4

Встретил на хабре полную соплей восторга статеечку. Вот цитата из нее

Как Морфеус в «Матрице», fmap знает, что делать; вы начали с Nothing и закончите тоже с Nothing! Это fmap-дзен. И теперь понятно, для чего вообще существует тип данных Maybe. Вот, например, как бы вы работали с записью в базе данных на языке без Maybe:

post = Post.find_by_id(1)
if post
  return post.title
else
  return nil
end

На Haskell же:

fmap (getPostTitle) (findPost 1)

Если findPost возвращает сообщение, то мы выдаём его заголовок с помощью getPostTitle. Если же он возвращает Nothing, то и мы возвращаем Nothing! Чертовски изящно, а?

источник http://habrahabr.ru/post/183150/

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

base.post1.postTitle
будет то же самое, если нет поста, вернется undefined. В любом случае, в любом ЯП это тривиально, самое трудное, с чем можно столкнуться в реализации — это обработка исключения. Тогда почему он так возбудился? Почему эти адепты ФП сначала орут «Я вам покажу магию хаскела», а в итоге показывают позорную банальщину? Это гипноз чтоли?

Лажа получится когда неотслеженный undefined попадёт куда не следует. А в хаскеле ругнётся на несоответствие типов на этапе компиляции, а не на этапе непредсказуемых последствий в рантайме продакшена.

PolarFox ★★★★★
()
Последнее исправление: PolarFox (всего исправлений: 1)
Ответ на: комментарий от Dark_SavanT

Я начал твои треды узнавать по названиям.

Все уже давно узнают, а ты только проснулся?

Не доведёт тебя это до добра

Что именно?

anonimous
() автор топика

так определи функцию

Ты не понял что такое fmap.

вернется undefined

Ты не понял зачем нужна статическая типизация.

Ты придрался к примеру.

Ты не знаешь хаскель.

Ты уже делаешь выводы.

Это гипноз чтоли?

В лучшем случае да. Я бы сказал, что это единственное, что может помешать установки диагноза.

Kuzy ★★★
()
Последнее исправление: Kuzy (всего исправлений: 2)

fmap (getPostTitle) (findPost 1)

слишком много букв. Лучше вот так: getPostTitle <$> findPost 1

если нет поста, вернется undefined

В хаскелле ты не присунешь undefined вместо поста куда не надо.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Kuzy

Я понял что такое функтор, там, в этой же статье написано об этом, но речь не о нем, а о том, какой в нем толк. Речь о том пафосе, с которым хаскелисты рассуждают о мнимой мощности языка, уж если взялся показать мощь, то показывай. Слова расходятся с делом.

anonimous
() автор топика

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

anonymous
()
Ответ на: комментарий от hateyoufeel

В хаскелле ты не присунешь undefined вместо поста куда не надо.

то есть, в хаскеле нельзя даже вот так:

if(posts.post23)doStuff(posts.post23)
Типы разные, приведения нет, так? Это фича? Как это решается? через жопу монады?

anonimous
() автор топика
Ответ на: комментарий от anonimous

Я понял что такое функтор

так определи функцию

Не понял.

уж если взялся показать мощь, то показывай

Судя по всему, тебе невозможно что-либо доказать, но можно еще раз попытаться:

http://eprints.nottingham.ac.uk/237/1/monparsing.pdf

Kuzy ★★★
()
Ответ на: комментарий от hateyoufeel

Лучше вот так: getPostTitle <$> findPost 1

Кста, я посчитал количество символов, если не считать скобок, ты выиграл ровно 1(!!!) символ. Это типично для хаскелистов, lol. Демонстрируют, буквально, перловскую лаконичность. Тонны лаконичности на нас изливают.

anonimous
() автор топика
Ответ на: комментарий от Kuzy

Не понял.

Я говорил о том, что конкретно эту задачу можно решить через обертку ф-цией, а не о том что функтор и функция — это одно и то же.

но можно еще раз попытаться:

Вместо того, чтобы совать целую книгу, можно было бы привести конкретный пример, а это выглядит как отмаз.

anonimous
() автор топика
Ответ на: комментарий от anonimous

Я говорил о том, что конкретно эту задачу можно решить через обертку ф-цией, а не о том что функтор и функция — это одно и то же.

Лол.

Вместо того, чтобы совать целую книгу, можно было бы привести конкретный пример, а это выглядит как отмаз.

38 страниц это книга, да.

Я тебе примеры на 2 строчки приводить должен? В этой книге, очень подробно, разбирается, всего, около 100 строк кода.

Kuzy ★★★
()
Ответ на: комментарий от Kuzy

на 2 строчки

Приведи на 10. Приведи кусок, который показывает сам принцип, некий общий случай, по которому виден выигрыш.

anonimous
() автор топика
Ответ на: комментарий от PolarFox

Лажа получится когда неотслеженный undefined попадёт куда не следует.

Как лажа в его недоязычке делает плюсы хаскелю? Это умеет ещё множество ЯП, причем лучше хаскеля. Дак причем тут хаскель?

И да, undefined в компилтайме - куллстори.

Какой тип будет тут в компилтайме:

fmap (getPostTitle) (findPost 1)

Либо общий, либо неопределённый. Собственно что ты этих хотел сказать?

carb_blog9
()

Зачем результат записывать в локальную переменную, проверять if'ом на null, и если null, то возвращать null?

Например, в Java (да и много где) тот витиеватый код эквивалентен:

return findById(1);
Другое дело, если в случае null нужная какая-то дополнительная логика. Но тогда и в Хаскелле она должна быть.

kovrik ★★★★★
()
Ответ на: комментарий от anonimous

if(posts.post23)doStuff(posts.post23)

Можно, но так пишут только дебилы.

hateyoufeel ★★★★★
()

Такое впечатление

что царь и тс - одно лицо. Хамская манера писать у анонiмуса всё ближе к царёвой

anonymous
()

Почему эти адепты ФП сначала орут «Я вам покажу магию хаскела», а в итоге показывают позорную банальщину?

На основе этой «банальщины» последовательно построены все действительно крутые вещи, которые есть в какашкеле. Но ты же взял, грубо говоря, букварь и кричишь: «Зачем придумали книги, они ведь такие тупые, глупые картинки да „мама мыла раму, раму мыла мама.“ Какой в них толк?» А надо брать Толстого, Чехова, Гоголя.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Ога. А чё, у него уже были виртуалы

anonymous
()

Здесь демонстрируется отсутвие null-а в хаскеле, что безусловно сильная сторона, хотя хаскель не один такой. А так же демонстрируется удобная идиома - функтор в конкретном случае с типом maybe. Что тут уникального: getPostTitle не может вернуть null, и проверка существования становится принудительной. В большинстве языков с null такие проверки не обязательны. Короче хаскель (да и любой другой сильно типизированный язык) позволяет явно выразить в коде и проверить компилятором то, что в других языках отлавливается глазами / отладкой. Конечно можно сделать maybe хоть в пыхе, но лучше от этого не станет, так как существующие библиотеки все равно будут возвращять null. Но я не согласен что хаскель какой-то уж сильно особенный в отношении nullability, например в scala код примерно такой же и даже fmap там юзают. Что касается типизации вообще, то и хаскель не предел. Agda еще круче, например.

dizza ★★★★★
()
Ответ на: комментарий от anonymous

В scala-библиотеках он не используется и нужен для совместимости с java либами.

dizza ★★★★★
()

Специально захожу в такие треды поржать над тем, как весь ЛОР устраивает класс коррекции для двух идиотов.

Deleted
()

В руби рельсах это принято делают так:
Post.find_by_id(1).try(:title)
вернет или заголовок поста или nil

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)
postTitle (post1 base)

будет то же самое, если нет поста, вернется Nothing. чего раскричался-то?

anonymous
()
Ответ на: комментарий от anonimous

ж если взялся показать мощь, то показывай. Слова расходятся с делом.

так читать нужно не «Функторы и Аппликативные функторы в смишных картинка», а что то другое. сходи на гитхаб и посмотри как применяется все это

anonymous
()

Не, я реально не понимаю, это у чувака реально мозги отсохли от ФП?

Он не лучше, он хуже, т.к. во втором варианте не видно логики. Надо вместо fmap использовать какой-нибудь liftToMaybe, в нормальном продакшен коде применение слишком обобщенных функций - запрещено.

anonymous
()
Ответ на: комментарий от anonymous

Людям, которым кажется, что fmap - это слишком обобщенная функция, в нормальный продакшен вообще ничего писать не стоит.

anonymous
()
Ответ на: комментарий от anonymous

Людям, которым кажется, что fmap - это слишком обобщенная функция

Если известно, что код работает с монадой мейби - то должны использоваться функции мейби. Иначе непонятно вообще, что код делает. Взять тот же пример из сабжа - если там написано fmap, то нет никакого способа выяснить, что именно делает этот кусок кода, т.к. неизвестно какой инстанс функтора нужен для аргумента. Такой код в продакшен просто никто не пропустит.

anonymous
()
Ответ на: комментарий от LongLiveUbuntu

Не, нафиг подход вирта в продакшне. Java нормально развивается. Недостатки языка фиксятся внешними тулами - генератороми кода и инспекциями. В частности вместо Option можно использовать аннотацию Nullable, а дальше анализировать код с помощью findbugs/idea.

dizza ★★★★★
()
Ответ на: комментарий от anonimous

doStuff =<< post23 posts

Ты уже 3 месяц (если не больше) пишешь всякую фугню на лоре за это время можно было изучить матчасть и устроиться интерном.

qnikst ★★★★★
()
Ответ на: комментарий от anonymous

т.к. неизвестно какой инстанс функтора нужен для аргумента.

Кому неизвестно? Компилятору в момент компиляции известно, программисту тоже известно.

hateyoufeel ★★★★★
()
Ответ на: комментарий от anonymous

Лол, в scala точно так же, как и в PHP, - null в языке есть.

Лол, в scala точно так же, как и в brainfuck, - «+» в языке есть.

MyTrooName ★★★★★
()
Последнее исправление: MyTrooName (всего исправлений: 1)

fmap (getPostTitle) (findPost 1)
так определи функцию

Он её определил, анонимную в круглых скобках.

На нормальных ЯП это вообще решается на раз, никаких проверок не нужно

А в хаскеле иначе?

если нет поста, вернется undefined

И это нормально, да? Т.е. когда ожидаешь экземпляр типа Т, возвращается null, и всё как бы норм?

shahid ★★★★★
()
Ответ на: комментарий от Dark_SavanT

а зачем вам чужие тела в собственной бане?

anonymous
()
Ответ на: комментарий от PolarFox

А в хаскеле ругнётся на несоответствие типов на этапе компиляции

с чего вдруг? откуда он знает что вернёт findPost 1 х ?

next_time ★★★★★
()

Не хотел я снова влезать в твои темы, но проснулся с утра и меня осенило что тут и зачем.

Вот есть такой банальный язык Erlang, с рождения production ready. И нет в нем никакой ерунды возвращающей Nothing, а только обычные функции.

Теперь, надо нам протащить информацию с ввода через некоторые вычисления, т.е. через цепочку функций к примеру. И что мы делаем? А собственно клепаем из функций программу и даем ей на вход наши данные. Что произойдет если в данных попадется то чего мы не ожидали? Правильно - программа упадет. Что б не упала, надо вводить обработчики ошибок, усложняя код и явно не увеличивая его производительность. Ведь функция там всегда должна возвращать что-то.

Т.е. что бы точно не падало надо накручивать везде кучу обработчиков ошибок, которые бы это дело отслеживали.

А можно просто иметь «функции» которые если вычисление не удается не возвращают ничего. Nothing.

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

anonymous
()
Ответ на: комментарий от anonymous

Erlang тут немного не в тему, у него идеология такая - «пусть падает». Если поток не может выполнить задачу, то он отписывается в лог и умирает (а далее возможно перезапускается супервизором). Весь этот защитный треш в Erlang'e просто не нужен.

NegatiV
()

Пытаться что-то объяснить ТСу это такой изощренный вид мазохизма.

Поциент:

  • не написал ни одной строки рабочего кода
  • не прочитал ни одной предложенной книги или статьи
  • выдумывает собственные альтернативные определения терминов
  • учит языки по corner cases, найденным на говноресурсах типа хабра или лора
  • физически не способен детально углубиться в какую-либо тему
  • перечисленные пункты считает признаками собственной гениальности
anonymous
()
Ответ на: комментарий от next_time

Если оно возвращает maybe или что-нибудь в этом духе, программист должен в конечном итоге явно обработать случай nothing. Как проверяемые исключения в жабе, только менее геморные.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

справедливости ради, из приведённого отрывка (в топике) этого не ясно. неясно также, чем оно в итоге существенно отличается от исключений в джаве в плане проверки и почему оно менее геморойно.

с другой стороны, при всём моём скепсисе к хаскелю, ТС поступил явно глупо, принеся сюда левые «тёрки» с другого сайта. кроме того, какое вообще отношение имеют отдельные рандомно взятые программисты к качеству языка не понятно. тем более, что педагогика (а здесь речь идёт именно об умении внятно объяснить) вообще в обязанности кодера не входит.

в общем, я за бан

next_time ★★★★★
()
Ответ на: комментарий от next_time

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.