Size: a a a

Elm Lang сообщество разработчиков

2017 October 26

AK

Anton Kotenko in Elm Lang сообщество разработчиков
В ладу
а есть ли условие, что если тип детерменированный то инстансов функтора он иметь не может?
я так понимаю, что функтора может, а вот Монады не может, потому что нет состояния fail
источник

AW

Arthur Welf in Elm Lang сообщество разработчиков
И функтор, и монада - это просто классы типов. Traversable, например, тоже класс типов.

Для того, чтобы сделать какую-то вашу структуру данных представителем класса типов Traversable, вам нужно сделать его функтором (т.е. описать, как ваша структура данных работает с функцией fmap) и определить, как с вашей структурой данных будет работать функция traverse или функция sequenceA.

Если вы это сделаете, то получите в качестве бонуса автоматическую реализацию кучи других функций, которые выражаются через fmap и traverse или sequenceA: https://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Traversable.html

Но вы можете и не делать свою структуру данных инстансом Traversable. Тогда, если вам потребуется какая-то из этих функций, вы можете ее самостоятельно написать. Хотя могли бы получить ее бесплатно.
источник

Вл

В ладу in Elm Lang сообщество разработчиков
Anton Kotenko
я так понимаю, что функтора может, а вот Монады не может, потому что нет состояния fail
так фейл же вообще дичь
костыль для do нотации
источник

AK

Anton Kotenko in Elm Lang сообщество разработчиков
ну Монада вообще в Хаскеле костыль как я понял :D
источник

AK

Anton Kotenko in Elm Lang сообщество разработчиков
в PS норм встроено
источник

Вл

В ладу in Elm Lang сообщество разработчиков
ну да она излишне вшита в язык. свой такой тайпкласс написать нельзя
источник

AK

Anton Kotenko in Elm Lang сообщество разработчиков
Arthur Welf
И функтор, и монада - это просто классы типов. Traversable, например, тоже класс типов.

Для того, чтобы сделать какую-то вашу структуру данных представителем класса типов Traversable, вам нужно сделать его функтором (т.е. описать, как ваша структура данных работает с функцией fmap) и определить, как с вашей структурой данных будет работать функция traverse или функция sequenceA.

Если вы это сделаете, то получите в качестве бонуса автоматическую реализацию кучи других функций, которые выражаются через fmap и traverse или sequenceA: https://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Traversable.html

Но вы можете и не делать свою структуру данных инстансом Traversable. Тогда, если вам потребуется какая-то из этих функций, вы можете ее самостоятельно написать. Хотя могли бы получить ее бесплатно.
да, всё верно, можно на "ты", спасибо! :)
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
Свой класс для монад написать можно. Только do-нотация работать не будет
источник

AW

Arthur Welf in Elm Lang сообщество разработчиков
Igor
Часто фибочи в продакшене юзаешь, ну да ясно понятно 😒
Фибоначчи в продакшене не юзаю, а вот получать n-ный элемент прогрессии требовалось. В Хаскеле я бы просто сделал функцию, которая рассчитывала бы бесконечный список, и, когда мне требовался n-ный элемент, она считала бы ровно до него, а потом останавливалась бы. А в Elm такого нельзя.

Тем не менее, я не считаю эти недостатки критическими. Язык хороший, и уж сравнивать его надо не с Хаскелем, а с JS, на котором пришлось бы писать, не будь Elm'а.
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
Впрочем, есть же applicative do :)
источник

Вл

В ладу in Elm Lang сообщество разработчиков
ну вот да. так что язык зависит от своей стандартной библиотеки
источник

ZK

Zheka Kozlov in Elm Lang сообщество разработчиков
do нотация для слабаков)))
источник

ZK

Zheka Kozlov in Elm Lang сообщество разработчиков
Нужно использовать доллары!!!
источник

AW

Arthur Welf in Elm Lang сообщество разработчиков
Aleksei (astynax) Pirogov
Впрочем, есть же applicative do :)
Applicative do не позволяет определять порядок выполнения операций, в отличие от монадического do.
источник

AW

Arthur Welf in Elm Lang сообщество разработчиков
Я вот, если честно, не понимаю ёрничанья насчёт сложности монад. Вы понимаете, как работает в Elm функция andThen? Вот она и есть монада - ни больше, ни меньше. Если где-то в цепочке тасков произойдёт ошибка, то вся цепочка завешится ошибкой. Если же нигде в цепочке ошибок не будет, то все функции отработают каждая друг за другом и каждая следующая, используя результат предыдущей - и мы получим в конце цепочки конечный результат.

Просто функция andThen в Elm'е определена только для встроенных типов. А в Хаскелле вы можете определить ее для любого своего типа. Но суть её будет той же самой: если результат вычислений идёт в одну ветку (имеет тип Ok, например) - то передавай его в следующую функцию. А если результат вычислений идёт в другую ветку (имеет тип Err, например) - делай с ним что-то другое (что именно - определяете вы) и не продолжай цепочку вычислений.
источник

Вл

В ладу in Elm Lang сообщество разработчиков
Arthur Welf
Я вот, если честно, не понимаю ёрничанья насчёт сложности монад. Вы понимаете, как работает в Elm функция andThen? Вот она и есть монада - ни больше, ни меньше. Если где-то в цепочке тасков произойдёт ошибка, то вся цепочка завешится ошибкой. Если же нигде в цепочке ошибок не будет, то все функции отработают каждая друг за другом и каждая следующая, используя результат предыдущей - и мы получим в конце цепочки конечный результат.

Просто функция andThen в Elm'е определена только для встроенных типов. А в Хаскелле вы можете определить ее для любого своего типа. Но суть её будет той же самой: если результат вычислений идёт в одну ветку (имеет тип Ok, например) - то передавай его в следующую функцию. А если результат вычислений идёт в другую ветку (имеет тип Err, например) - делай с ним что-то другое (что именно - определяете вы) и не продолжай цепочку вычислений.
да с andThen нет магии
просто это разные andThen для каждого типа.
ты просто не можешь сделать функции типа sequence
источник

AK

Anton Kotenko in Elm Lang сообщество разработчиков
в этом смысле и промисы монады, да, но в Elm так и написано "и потом", а в Хаскеле do-нотация странноватая и уже упомнутые <$>/<*> которые нарушают флоу чтения кода. Для пользовательских "монад" сделаны команды/мессаджи, чтобы все сайд-эффекты крутились в одном цикле update
источник

NK

ID:154127650 in Elm Lang сообщество разработчиков
Так-то можно сделать a-la haskell core и руками передавать {pure, andThen} как явный параметр. Выглядеть будет так себе, но зато ты сможешь сделать sequence.
источник

Вл

В ладу in Elm Lang сообщество разработчиков
а тип у них какой?
источник

AW

Arthur Welf in Elm Lang сообщество разработчиков
Anton Kotenko
в этом смысле и промисы монады, да, но в Elm так и написано "и потом", а в Хаскеле do-нотация странноватая и уже упомнутые <$>/<*> которые нарушают флоу чтения кода. Для пользовательских "монад" сделаны команды/мессаджи, чтобы все сайд-эффекты крутились в одном цикле update
Ну так а в Хаскелле вместо andThen написано >>= - что, разве это сильно усложняет? Сделай себе алиас в Хаскелле andThen = (>>=) и используй себе andThen.

В do-нотации тоже нет ничего странного. Что там может вызывать сложность? Оператор <-? Ну так он просто распаковывает упакованное в обёртку значение. Если у нас result = Ok 4, то value <- result вытащит четвёрку из result и value будет иметь значение 4. Если result = Just "something", то value <- result присвоит переменной value значение "something". Но если result будет Err error или Nothing, то из-за того, что мы определили наши типы представителями класса монад, то дальнейшее вычисление прервется и нам не надо писать всяких if result ... then ... else и case result of для того, чтобы обработать эти случаи. Удобно же!
источник