Size: a a a

2021 January 27

IK

Ilya Kos in Haskell
Maxim Koltsov
можно структуру модулей рисовать
Похоже на то?

https://github.com/yav/graphmod
источник

MK

Maxim Koltsov in Haskell
да, похоже)
источник

ЖК

Жук Короед in Haskell
Эта штука не подлежит tail call optimization
go acc | acc /= stop = f acc <|> go (next acc)
.......| otherwise = Nothing
А эта подлежит, верно?
go acc
.....| acc /= stop =
.........case f acc of
..........Nothing -> go (next acc)
..........result -> result
.....| otherwise = Nothing
источник

MK

Maxim Koltsov in Haskell
Гхц вполне может переписать первое во второе, заинлайнив определение <|>
источник

MK

Maxim Koltsov in Haskell
А может и не переписать
источник

A

Aleksandr Khristenko in Haskell
Жук Короед
Эта штука не подлежит tail call optimization
go acc | acc /= stop = f acc <|> go (next acc)
.......| otherwise = Nothing
А эта подлежит, верно?
go acc
.....| acc /= stop =
.........case f acc of
..........Nothing -> go (next acc)
..........result -> result
.....| otherwise = Nothing
Я может что-то путаю, но в остальных языках TCO нужно для того, чтобы не выйти за пределы стека когда вызываются функции.
Но при этом в хаскеле нет call stack.
источник

MK

Maxim Koltsov in Haskell
стек есть, в RTS
источник

MK

Maxim Koltsov in Haskell
и передача аргументов через него есть
источник

MK

Maxim Koltsov in Haskell
а гхц на самом деле умеет превращать тейл коллы в циклы с настоящими джампами
источник

MK

Maxim Koltsov in Haskell
более того, джампы даже на уровне синтаксиса Core есть
источник

ЖК

Жук Короед in Haskell
А использовать {-# INLINE #-} прагму он не дает вне модуля, где объявлена <|>.
Нет никакого трюка, чтоб ее гарантированно заинлайнило, кроме как напиисать с нуля и поставить прагму?
источник

MK

Maxim Koltsov in Haskell
нету
источник

MK

Maxim Koltsov in Haskell
потому что чтобы он заинлайнил что-то из другого модуля, надо чтобы при компиляции того другого модуля она попала в его интерфейсный файл
источник

A

Aleksandr Khristenko in Haskell
Maxim Koltsov
а гхц на самом деле умеет превращать тейл коллы в циклы с настоящими джампами
Значит я путаю.
источник

MK

Maxim Koltsov in Haskell
Жук Короед
А использовать {-# INLINE #-} прагму он не дает вне модуля, где объявлена <|>.
Нет никакого трюка, чтоб ее гарантированно заинлайнило, кроме как напиисать с нуля и поставить прагму?
а с какой целью вообще ты этим интересуешься?
источник

ЖК

Жук Короед in Haskell
Чтобы научиться гарантировать оптимизацию хвостовой рекурсии, когда надо 😁
источник

MK

Maxim Koltsov in Haskell
звучит как преждевременная оптимизация
источник

FL

First Last in Haskell
Вечер добрый! Подсобите пожалуйста, почему он ждет Int?
fibs :: [Integer]
fibs = 0:1:zipWith (+) fibs (tail fibs)
fib n = fibs !! n

perimeter :: Integer -> Integer
perimeter 0 = 4
perimeter n = (*) 4 $ sum f
where
  f = foldl (\acc x -> fib x : acc) [] [1..n + 1]



    • Couldn't match expected type ‘Int’ with actual type ‘Integer’
   • In the expression: n + 1
     In the third argument of ‘foldl’, namely ‘[1 .. n + 1]’
     In the expression: foldl (\ acc x -> fib x : acc) [] [1 .. n + 1]
  |
11 |    f = foldl (\acc x -> fib x : acc) [] [1..n + 1]
источник

ВЩ

Взщз Щщщхш in Haskell
First Last
Вечер добрый! Подсобите пожалуйста, почему он ждет Int?
fibs :: [Integer]
fibs = 0:1:zipWith (+) fibs (tail fibs)
fib n = fibs !! n

perimeter :: Integer -> Integer
perimeter 0 = 4
perimeter n = (*) 4 $ sum f
where
  f = foldl (\acc x -> fib x : acc) [] [1..n + 1]



    • Couldn't match expected type ‘Int’ with actual type ‘Integer’
   • In the expression: n + 1
     In the third argument of ‘foldl’, namely ‘[1 .. n + 1]’
     In the expression: foldl (\ acc x -> fib x : acc) [] [1 .. n + 1]
  |
11 |    f = foldl (\acc x -> fib x : acc) [] [1..n + 1]
источник

ВЩ

Взщз Щщщхш in Haskell
!! принимает интовый индекс, вот
источник