Size: a a a

2021 January 14

VB

Vadym Biliuk in Haskell Start
Понял, спасибо
Таким образом, pure положит ( f a b ) в аппликативный функтор?
источник

A

Aleksandr Khristenko in Haskell Start
Vadym Biliuk
Понял, спасибо
Таким образом, pure положит ( f a b ) в аппликативный функтор?
Ну да. На выходе из liftA2 будет тот-же функтор что был на входе.
источник

VB

Vadym Biliuk in Haskell Start
Спасибо!
источник

A

Aleksandr Khristenko in Haskell Start
Vadym Biliuk
Спасибо!
Мне кажется do нотация там приведена просто чтобы показать последовательность эффектов. Что сначала эффект превого функтора, потом второго.
источник

VB

Vadym Biliuk in Haskell Start
Да, мне просто тяжело было понять сразу как используется <*> и pure
Я только добрался до раздела аппликативных функторов в книге, решил проглядеть в доке что это такое сначала
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Aragaer
А вот у меня тут возник дурацкий вопрос. У меня есть некоторая функция, которая ищет разные варианты работы со стейтом. То есть f :: [State World ()]. Внутри есть несколько вариантов ветвления и исходя из этого получается дерево разных конечных результатов. Но некоторые действия являются независимыми и "сделать а, потом сделать б" приводит к ровно тому же результату, что и наоборот. То есть я хочу чтобы у меня реально разветвленные вычисления сливались обратно, если стейт оказывается одинаковым. Это надо самому садиться и реализовывать instance Monad для такой моей конструкции?
Практически никогда не нужно делать свои инстансы для Monad. Отсечку дублей лучше сделать во внешнем коде.
источник

A

Aleksandr Khristenko in Haskell Start
Vadym Biliuk
Да, мне просто тяжело было понять сразу как используется <*> и pure
Я только добрался до раздела аппликативных функторов в книге, решил проглядеть в доке что это такое сначала
pure поднимает значение в функтор.
<*> применяет функцию из одного функтора к значению в другом при этом применяя эффекты
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Aleksandr Khristenko
Мне кажется do нотация там приведена просто чтобы показать последовательность эффектов. Что сначала эффект превого функтора, потом второго.
Это (последовательность) не гарантируется
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Именно поэтому Аппликатив может параллелиться
источник

A

Aleksandr Khristenko in Haskell Start
Aleksei (astynax) Pirogov
Это (последовательность) не гарантируется
Разве? Если у тебя 2 врайтера и делаешь liftA2 у тебя не гарантируется результат?
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Как инстанс решит, так и будет
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Тип <*> не гарантирует порядок
источник

AP

Aleksei (astynax) Pi... in Haskell Start
А тип >>= — гарантирует
источник

A

Aragaer in Haskell Start
ну сейчас у меня реализовано именно в виде
f :: World -> [State World ()]
f currentWorld = do
 whatToDo <- possibleActions
 let updatedWorld = execState whatToDo currentWorld
 if gotResult updatedWorld
   then pure whatToDo
   else (whatToDo >>) <$> f updatedWorld
источник

A

Aleksandr Khristenko in Haskell Start
Aleksei (astynax) Pirogov
А тип >>= — гарантирует
Там про зависимость следущего эффекта от значения вычисления предыдущего.
источник

A

Aragaer in Haskell Start
и в такой ситуации я не вижу ветвлений. А их там слишком много, чтобы "все посчитать, потом отсечь"
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Aleksandr Khristenko
Там про зависимость следущего эффекта от значения вычисления предыдущего.
Это одно и то же
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Зависимость форсит порядок. Даже для >>
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Написать такой инстанс Applicative для Writer, при котором порядок записи будет обратным, легко. Потому что <*> не запрещает
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Инстанс Monad с обратным порядком эффектов уже сделать сложнее
источник