Alexander
threaded haskell работает в nix в linux subsystem в windows
Кабачок
Но он не знает ничего кроме... э... слов?
Кабачок
(@qnikst про аутиную типизацию ты удалил?)
Alexander
ytn
Alexander
нет конечно
Alexander
я даже не читаю чо мы там про типизации пишите
Alexander
ну и это бы не трогал точно
Andrei
Anatoly
сорри за вопрос новичка: почему haskell не диагностирует незавершаемые выражения?
например,
x = x + 1
x -- overflow
?
Vasiliy
потому что в общем случае это невозможно
Misha
Потому что в общем случае эта задача неразрешима, но есть liquid haskell, который умеет что-то похожее.
Anatoly
спасибо!
кана
Траверсалы выглядят как функторы для линз, только ограниченее.
Alexander
@anatolijs например x = 1:x
Alexander
это незавершаемая или завершаемая операция?
Anatoly
это конструирование бесконечного списка
Anatoly
если она будет вызвана, то не завершится
Aleksei (astynax)
в хаскеле - завершится
Alexander
а take 10 x?
Aleksei (astynax)
ибо лень
Anatoly
Anatoly
Aleksei (astynax)
length [1..] тоже не завершится :)
Anatoly
не смотря на бесконечное выполнение в некоторых контекстах, в данном случае все будет в порядке
Alexander
не знаю, что такое бесконечное выполнение
Alexander
то, что было бы бесконечным выполнением если нету шаринга или лени?
Anatoly
я пока не могу понять, как он делает так, что take 10 x завершается
Cheese
Cheese
Anatoly
круто, спасибо!
Alexander
есть ещё более интересный вариант:
any [ a^n + b^n == c^n | a <- [1..], b <- [1..], c<-[1..], n<-[1..]]
Aleksei (astynax)
Хаскель всё вычисляет только тогда, когда это действительно нужно
Alexander
это завершается или нет?
Alexander
только transpose для аргументов сделать, чтобы более разумно по ним бегал
Alexander
вообще есть такая проблема останова
Alexander
и мы или выкинем кучу программ для которых доказыать не умеем или возьмем не тьюринг полный язык, который не позволит получить незавершаемость
Кабачок
что есть структурная?
кажется я только что придумал новый термин. но вообще это как записи в млях работают, даже статья в вики есть https://en.wikipedia.org/wiki/Structural_type_system
Anatoly
причем, haskell не допускает левую рекурсию при определении бесконечных последовательностей, что понятно
y = y : 1 — не скомпилируется
Зигохистоморфный
А как ты пытаешься сделать 1 хвостом?
Кабачок
+
Alexander
нет
Зигохистоморфный
Так оператор просто не работает
Alexander
тут типы тупо не сходятся
Alexander
let y = y++[1]
Alexander
пожалуйста
Anatoly
точно, спасибо!
Кабачок
Правда тут уже take работать не будет afaik
Зигохистоморфный
Конкатенация слишком прожорливая штука
Alexander
хорошая шутка
Зигохистоморфный
Ну как бы надо полностью пройти 1 и потом хвостом подсоединить второй
Alexander
вы же не про пример выше?
Aleksei (astynax)
Зигохистоморфный
А что если это два бесконечных списка?
Aleksei (astynax)
Ты не поверишь:
λ> take 10 $ [1..] ++ [1..]
[1,2,3,4,5,6,7,8,9,10]
Aleksei (astynax)
конкатенация - тоже ленивая, начинает отдавать новый список поэлементно
kosc
Ты не поверишь:
λ> take 10 $ [1..] ++ [1..]
[1,2,3,4,5,6,7,8,9,10]
Слушайте, а где это приглашенька такая у интерпретатора? А то в ghci по дефолту вроде как просто написано "Prelude>"
Aleksei (astynax)
в .ghci
kosc
Это конфиг всмысле?
Aleksei (astynax)
:set prompt "\ESC[32mλ> \ESC[m"
Aleksei (astynax)
можно прямо в репле попробовать
kosc
Ага, работает.
kosc
Спс.
Зигохистоморфный
Да, но не будет видно что за модули ты уже подключил
Aleksei (astynax)
это можно узнать и по-другому
Aleksei (astynax)
:show modules
Anatoly
Aleksei (astynax)
Вопрос был про завершение и про дороговизну конкатенации :)
Aleksei (astynax)
Так что в хаскеле конкатенация - сравнительно дешевая
кана
Чет у меня получился какой-то сложный toListOf
toListOf :: Optic (->) (K (Endo [a])) s s a a -> (s -> [a])
toListOf lens = flip appEndo [] . getK . lens (K . Endo . (<>) . (:[]))
Зигохистоморфный
Нужен foldOf или как его там)
Зигохистоморфный
Вернее foldrOf
кана
я кату делаю твою, тут нет никаких фолдофов
Leonid 🦇
кату?
кана
https://www.codewars.com/kata/lensmaker/train/haskell
кана
вот тут меня еще гложат сомнения
elements :: T.Traversable f => Traversal (f a) (f b) a b
elements = traverse
в сорцах либы там тоже фолдоф (или елементсОф), но зачем - хз
кана
Как часто вы используете coerce? Выглядит полезным при оптимизации, но нужно серьезно жертвовать читаемостью и понимаемостью кода имхо
Vasiliy