Alexander
очень сложное определение если честно, но самое формальное из попсовых статей
Alexander
в остальных они чуть ли не перечислением даны
Alexander
в Moggi было так, есть фунции a -> b (с категорией и т.д.), есть эффекты, нечно что не выражается этой категорией a \upper{t}-> b
Влод
Alexander
нет, зависит от результата
Anonymous
Стражевые операторы внутри let юзабельны?
Alexander
a \upper^t -> b - не образует категорию и все плохо
Alexander
поэтому мы вводим типа данных который "capture" эффект, и получаем a -> M b
Alexander
где у нас есть известные M для Maybe, List, Cont
Alexander
далее, нужно нам как-то чистые фукнции лифтить в такое, те. ?? :: (a -> b) -> M a -> M b обана этож функтор!
Alexander
а потом надо объединять 2 функции с эффектами
Alexander
можно использовать fmap, тгда будет a:: M a, f :: a -> M b, fmap f a :: M (M b) и что же делать! у нас nested datatype
Alexander
а нужно ?? :: M (M b) -> M b
Alexander
а мы умные мы знаем ТК это ж join
Alexander
и значит чтобы передать значения из одного действия с эффектами в другое - нужн monad
Alexander
а дальше куча аккуратной математики, чтобы это доказать и вывести
Alexander
но кратного пересказа более чем достаточно для практики
Alexander
@t1mee а зачем?
Влод
Ладно ещё раз попытаюсь
Alexander
т.е. даже этот пересказ не нужен и без него можно жить
Влод
Не могло ли выйти так что эффекты удачно (По Божьей Милости) оказались выражены в терминах монад
Alexander
@t1mee там вроде на лекции была задача для факториала или фибонначи через узел
Влод
и это никак не влияет на сами монады
Anonymous
Так я их изи сделал
Anonymous
Проблемс в том, что тут не одна, а n*3 рекурсии
Alexander
код не покажешь, может проще будет про это подсказать
Anonymous
Для каждой аккумулятор пилить что ли?
Alexander
на лекции fib через zipWith было?
Anonymous
Боюсь, у тебя кровь из глаз пойдет)
Влод
то есть как мы считаем похожесть смысла слов через вектора, но при этом линал живёт сам по себе
Anonymous
fibonacci :: Integer -> Integer
fibonacci n | n < 0 = mhelper n
| n > 0 = helper 1 0 n
| otherwise = 0
helper :: Integer -> Integer -> Integer -> Integer
helper acc x 1 = acc
helper acc x y = helper (x+acc) acc (y-1)
mhelper :: Integer -> Integer
mhelper (-1) = 1
mhelper y = (-1)^(1-y) * fibonacci (-y)
Anonymous
Этот то робит
Влод
и таким образом (если моя догадка верна) нельзя сказать, что монады это эффекты
Alexander
@vlastachu так и есть, на мой взгляд, ты все правильно говоришь
Влод
но можно сказать, что монады в том числе ещё и эффектами являются
Alexander
ок, если я скажу не эффеты, а computation context
Alexander
прозе будет?
Влод
компьютейшн тут тоже непричём
Alexander
ну монады не являются эффектами, это алгебраические структуры, которые позволяют композить эффекты, тогда уж
Влод
математика она такая аморфная
Влод
масса
Anonymous
Alexander
это средство имея m (m a) получить m a
Alexander
я ни для fib ни для этой задачи не делал аккумулятор
Alexander
если посмотреть в оригинальный текст Moggi (как я только что сделал), то там она все время приводит список проблем, для которых монады оказываются пиздатыми
Влод
скорей всего мой препод по лингвистике сказал бы что вы процессист и привыкли думать что вся семантика это только вычисления (опять же если все предыдущие догадки были верны)
Alexander
считаешь ли ты m типом данных инкапсулирующих эффект или computational context или бурито - не суть важно
Alexander
и сайд-эффекты - это только одни из них. Например нондетерминизм он упоминает наряду с сайд-эффектами
Alexander
это один из сайд-эффектов
Alexander
вопрос терминологии, как я уже сказал
Alexander
moggi их разделяет везде
Alexander
https://gyazo.com/aa01987a1dd5d58fb1af285e7db296fb
Alexander
https://gyazo.com/274f709bdade144371f2e1a6b5f5eaaa
Alexander
и т.д
Alexander
ok
Влод
2017й год а в хаскельных конфах всё ещё монады обсуждают
Alexander
так ты и начал вроде?
Влод
ну да)
Alexander
с другой стороны другие не разделяют
Sasha
evenSum :: [Integer] -> Integer
evenSum l = accumSum 0 l
accumSum n l = if l == []
then n
else let x = head l
xs = tail l
in if even x
then accumSum (n+x) xs
else accumSum n xs
main = do
evenSum [1,2,3,4,5]
Couldn't match expected type `IO t0' with actual type `Integer'
Alexander
я сразу сказал, что это все не важно, и посоветовал человеку не читать это
Alexander
компилятор говорит, что у evenSum тип не IO a
Alexander
если ты хочешь вывести на экран, наверное, нужно это явно сказать, сказав print $ eventSum [1..5]
Sasha
Евгений
Влод
Ну короче объясню мою простую идею.
(Новичок спросит) Что такое монады?
трататата ЭФФЕКТЫ трататата...
А ок (для себя решил, что штука которая намертво прикручена к IO и поэтому сделали для неё do нотация ведь как бы в другом виде оно и не надо)
Anonymous
Я умру от спида, если в теле функции, где я вставил хелпер-функцию я применю саму эту функцию в теле хелпера?
Влод
Ну и как бы я это объяснил: забей (ну и попросил бы объяснить если он сам разберётся)
Alexander
Alexander
foo n = xs !! n
where xs = 0:1:2:zipWith (+) (tail xs) (zipWith (\x y -> x - 2*y) (tail (tail xs)) (tail (tail (tail xs)))
Sasha
Alexander
гораздо эффективнее если ты будешь задавать вопросы по одному максимально конкретные, так то конечно объяснят, но для понимания это хуже будет
Anonymous
лол
Anonymous
Суммирует эелементы списка, но это не точно
Влод
Anonymous
Не помню, что делает even
Alexander
@t1mee про foo n это тебе программа кстати
Alexander
even возвращает True если число четное