Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • Mar 14 2015 23:15
    User @mr-mig banned @putin-hero from this room
  • Mar 14 2015 22:31
    User @mr-mig banned @stepan-bendera from this room
Gregory Reshetniak
@ror6ax
 -- "return" constructs a one-item list.
  return x = [x]
  -- "bind" concatenates the lists obtained by applying f to each item in list xs.
  xs >>= f = concat (map f xs)
  -- The zero object is an empty list.
  mzero = []
як це зробити в якийсь FooBarMonad?
спробував ось так
class Monad m where
  -- "return" constructs a one-item list.
  return x = [x]
...
‘mzero’ is not a (visible) method of class ‘Main.Monad’
підказали що mzero не має бути в монаді, прибрав
отримав
‘>>=’ is not a (visible) method of classMain.Monad
Не розумію нічого. Логіка була взяти найпростішу монаду, задекларувати під своїм кастомним іменем і потім потроху прикручувати п"яте колесо
Gregory Reshetniak
@ror6ax
Окреме питання - в class Monad m where - m є параметром типу?
як взагалі дати своїй монаді кастомну назву?
по мотивам
class Foo
def Bar = {}
@ror6ax example of how monad is defined in Base
да m это переменная типа
Gregory Reshetniak
@ror6ax
Якимсь чином можна дати назву монаді?
Dmytro Sirenko
@EarlGray
@ror6ax
  1. Для чого копіювати якісь визначення у монаду?
  2. Ви розумієте різницю між class та instance?
  3. Що ви хочете досягти своєю монадою?
Gregory Reshetniak
@ror6ax
Питання в тому як зробити новий class
instance - не питання
досягти розуміння як працюють монади, надіюсь. більшість туторіалів зациклені на Maybe, яка для мене абсолютно не є інтуітивним прикладом
на рівні теорії категорій я розумію про що іде мова
в скалі можу задефайнити свою
з хаскелем проблема на рівні синтаксису :)
Anatolii Prylutskyi
@anpryl
на степике есть курсы по хаскелю, там есть 5-ый модуль про монады, что разобраться с ними - лучше всего изучить стандартные(Maybe,Either,Reader,Writer,State) и пописать какой-то код на них, потом уже до своих доберешся
также в Real World Haskell не плохо к ним подводят в течении нескольких глав
Dmytro Sirenko
@EarlGray

class у Хаскелі це не class у Скалі, instance це не об’єкт.

class це, дуже грубо кажучи, скалівський трейт, а instance це, дуже грубо кажучи, реалізація методів трейта для якогось типу

В результаті монада це клас, тому що вона повинна мати методи return та >>=, але реалізовувати їх в самому класі безглуздо, тому що Хаскельні typeclass набагато абстрактніші і позбавлені семантики об’єктів взагалі, в Хаскелі не існує extends, а відношення між class та instance не містить ніякого сабтайпінгу, а лише факт, що операції із class можна застосовувати до типу X, якщо десь існує instance Class X

Можна на свій клас накласти обмеження, що тип-параметр уже повинний мати instance якогось іншого класу: наприклад, клас MonadPlus описується як instance Monad m => MonadPlus m where ... , що означає, що MonadPlus може мати instance тільки для тих типів X, в яких уже є instance Monad X
Dmytro Sirenko
@EarlGray
І потім, із визначенням власних монад: треба мати на увазі, що будь-яка монада в ідеалі повинна задовольняти монадні закони (https://wiki.haskell.org/Monad_laws) — що в самому Хаскелі виражається ніяк, тому що формальних механізмів доведення, наприклад залежних типів, у Хаскелі поки що нема.
І тому я питав про те, що значить ця нова монада, тому що монада це не чистий лист (як клас у Скалі), в який можна поступово щось дописувати, а чітка абстракція із чіткими законами.
Dmytro Sirenko
@EarlGray
І тут проблеми не із синтаксисом, а з тим, що return x = [x] можна визначати лише в instance Monad (List a), а клас Monad це лише набір операцій, які в контексті class Monad абсолютно абстрактні і мають лише тип (і, неявно, закони), а реалізації можуть набувати тільки в instance для якогось конкретного типу.
Dmytro Sirenko
@EarlGray

Тобто є якийсь власний тип X, і є якийсь клас Class, то твердження

instance Class X where
   classOp1 = ...
   classOp2 = ...

лише означає, що в будь-яку функцію типу fun :: Class t => t -> t можна передати значення типу X і якщо в fun буде згадуватись classOp1 над значенням типу X, то її реалізація буде братись саме із instance Class X

А хаскельні монади це лише клас, який частково передає, що таке категорна монада, і визначає, як саме виглядає монадна композиція для типів, для яких існує instance Monad X

Dmytro Sirenko
@EarlGray
Перепрошую за простиню тексту, це все набагато природніше усвоюється із поступовим розбиранням прикладів існуючих «монад» (за умови, що сприйняття не забивається ніякими об’єктно-орієнтованими аналогіями, Хаскель не має жодної ООП-семантики)
Anatolii Prylutskyi
@anpryl
хорошие слайдики для начинающих
nponeccop
@nponeccop
врєдниє :)
StarsC
@StarsC
кто-то уже зарегился на цюрихаке?
регистрация открыта.
Andrii Chebukin
@xperiandri

Всем привет.
Удалённо требуется Senior Haskell разработчик.

Цитата от клиента:
Experienced - Senior
The candidate must have a completed degree.
The candidate must have some experience working with Agile and be capable of working with TDD.
We don't measure seniority in years of experience but in skills, we must see clear tests (both unit tests and integration tests) the code must be clean and clear without using comments too much, the project must be more than just auto generated code (or templates), a clear README file helps. There will be added points for open source contributions. They must show use of good practices and advanced knowledge of functional programming. The code must show that this person will be able to be productive as a Senior developer immediately.
A good English level is a must.

Соответственно хочет увидеть код хотя бы одного проект покрытого тестами, желательно с GitHub, но архивом тоже можно.

Если вы middle c английским уровня B2, вероятность пройти тоже есть.

Присылайте резюме или профиль LinkedIn
Skype: andrii.c.sharp
Telegram, Viber, WhatsApp: +380913509594
Email: cv@scrtcrcl.com

Mike Bohdan
@mikebohdan

привет, нубский вопрос:
почему данный код отрабатывает не в той последовательности при запуске из бинарника? при запуске в ghci все работает как задумано

main = putStr "Enter your name: "
       >> getLine
       >>= (\name -> putStrLn $ "Hello, " ++ name ++ "!")

Ожидаемая мной работа (так работает в ghci):

Enter your name: John
Hello, John!

фактическая

John
Enter your name: Hello, John!

При этом если немного изменить код на следующий все работает ожидаемо во всех случаях

main = putStrLn "Enter your name: "
       >> getLine
       >>= (\name -> putStrLn $ "Hello, " ++ name ++ "!")

Если переписать через do - поведение во всех случаях сохранится

nponeccop
@nponeccop
буферизацию надо отключить
Dmytro Sirenko
@EarlGray
stdout тут line-buffered (відправляється на вивід тільки по закінченню рядка), так що треба або
— робити hFlush stdout вручну після кожного putStr;
— або на початку програми hSetBuffering stdout NoBuffering;
(заморочки tty і стандартної бібліотеки С)
piliponful
@Piliponful
Оу. Тут кто то есть(?
EarlGray @EarlGray forces evaluation of thunk "is anybody here?"
Dmytro Sirenko
@EarlGray
є
piliponful
@Piliponful
Я понял)
А почему на украинском разговариваете?
Я бы понял если на англ.
Dmytro Sirenko
@EarlGray
Англійської і на роботі вистачає :)
Lispre
@Lispre
happy new year, everyone
nponeccop
@nponeccop

А почему на украинском разговариваете?

dev-ua

Yuriy Pitomets
@Pitometsu
такие дела, есть N-ное к-во позиций OCaml. Оплата достойная. Кто умеет, или желает свичнутся -- welcome в личку.