Size: a a a

2020 December 07

JM

John Meow in Haskell Start
Переслано от John Meow
И почему foldl на них тогда не работает?
источник

JM

John Meow in Haskell Start
John Meow
Переслано от John Meow
И почему foldl на них тогда не работает?
Я же могу просто через flip поменять порядок операндов и foldl превратится в foldr
источник

к

кана in Haskell Start
все, как только создалось значение Cons x (foldr f z xs)
дальше ничего вычисляться не будет
потом мы можем заматчить результат

let x = Cons x (foldr f z xs)
h x =
 case x of
   -- в этот момент вычисляется конструктор x, чтобы проверить, это Nil или Cons
   Nil -> pure ()
   Cons x xs -> do
     -- в этот моменте он значет что конструктор Cons, но x и xs не вычислены еще
     print x
     -- после этого момента он уже вычислил x, но xs все еще нет
     
     if x < 10 then h xs else pure ()
     -- на следующей итерации он уже вычислит xs, но вычислит список ровно настолько, насколько нужно, на первом же элементе >= 10 он прекратит вычлять список, какой бы длины он не был
источник

AK

Aleksey Kislitsa in Haskell Start
Aleksei (astynax) Pirogov
Так вы убрали src из executable, или всё также указан два раза? Мне кажется, что не убрали
Если убрать из executable, то варнинги пропадают, а в VSCode навигация по коду отрубается
источник

AK

Aleksey Kislitsa in Haskell Start
Aleksei (astynax) Pirogov
(лучше сразу сделать нормально — указать либу зависимостью экзешника, а не костылять)
Это как?
источник

к

кана in Haskell Start
John Meow
Я же могу просто через flip поменять порядок операндов и foldl превратится в foldr
foldl работает в другом порядке, это не просто другой порядок аргументов, это другое направление сворачивания

результат сворачивания н-ого элемента идет в следующую итерацию, и что она там вернет не ясно, в итоге пока мы все не вычислим, не ясно что получим
источник

JM

John Meow in Haskell Start
кана
foldl работает в другом порядке, это не просто другой порядок аргументов, это другое направление сворачивания

результат сворачивания н-ого элемента идет в следующую итерацию, и что она там вернет не ясно, в итоге пока мы все не вычислим, не ясно что получим
The reason we call it a right fold is that there are two arguments in a binary function: a left argument and a right argument. The left fold compacts the list into the left argument, and the right fold into the right argument.
источник

к

кана in Haskell Start
например вот

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

в итоге пока все не вычислим, никак не получим результат
источник

JM

John Meow in Haskell Start
John Meow
The reason we call it a right fold is that there are two arguments in a binary function: a left argument and a right argument. The left fold compacts the list into the left argument, and the right fold into the right argument.
Насколько я понял, они просто ставят элементы листа с разн сторон
источник

к

кана in Haskell Start
foldr f z (Cons a (Cons b Nil)) =
f a (f b z)

foldl f z (Cons a (Cons b Nil) =
f (f z a) b

какой бы f не была, последний f выполнятся для последнего элемента, а для этого нужно дойти до последнего элемента, в бесконечном списке это невозможно
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Aleksey Kislitsa
Если убрать из executable, то варнинги пропадают, а в VSCode навигация по коду отрубается
хреновая навигация, значит
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Aleksey Kislitsa
Это как?
я выше дал пример и даже стрелками показал важные места
источник

AK

Aleksey Kislitsa in Haskell Start
Aleksei (astynax) Pirogov
я выше дал пример и даже стрелками показал важные места
Я так и сделал
источник

AK

Aleksey Kislitsa in Haskell Start
Aleksei (astynax) Pirogov
хреновая навигация, значит
Это сейчас рекомендуемый плагин для vscode
Что с нехреновой навигацией?
источник

JM

John Meow in Haskell Start
кана
а вот пока не попросишь, не будет перебирать

что если например тебе нужны только первые 5, или вообще узнать, есть ли там хотя бы один элемент

isEmpty = foldr (\_ _ -> False) True

вот эта функция вообще не будет вычислять ни одного элемента, только проверит, какой конструктор, поэтому вернут False даже на бесконечном спислке
А, то есть он все же достаточно ленив, чтобы понять, что значение функции не зависит от аргументов?
источник

к

кана in Haskell Start
тут дело не в ленивости уже, а в том что вызов в любом случае есть
источник

к

кана in Haskell Start
хаскель откладывает вызовы функций, как например с foldr он откладывает вызов foldr для хвоста
источник

JM

John Meow in Haskell Start
Понятно только то, что ничего не понятно
источник

JM

John Meow in Haskell Start
Ладно, попробую дальше читать, мб осознаю
источник

к

кана in Haskell Start
ну хорошо, вот функция

f = 1 : repeat 0

чтобы получить первый элемент f достаточно сматчить f в (x:xs) и забрать x, repeat 0 вычислять не нужно, поэтому repeat 0 даже не будет вычисляться

foldr (:) делает точно так же как f
источник