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
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.