
A64m
03.04.2018
19:54:47
можно, конечно

Alexander
03.04.2018
19:55:55
можно конечно

Alexander
03.04.2018
19:56:14
cycle и сооружает

Alexander
03.04.2018
19:56:27
кстати, у студентов каких-то просили сделать doubly linked list

Google

Alexander
03.04.2018
19:56:35
вполне себе делается
cycle кстати не то
оно то, только по представлению памяти
но если я хочу modify :: Int -> a -> S a -> S a
то в списке созданным cycle случится не то, что ожидается

Dmitry
03.04.2018
20:02:22

Pineapple
03.04.2018
20:02:37
Да

Dmitry
03.04.2018
20:07:52
А есть ли разница между cycle и cycle'?
cycle' a = xs where xs = a ++ xs

Alexander
03.04.2018
20:10:37
cycle xs = xs' where xs' = xs ++ xs' если что

Dmitry
03.04.2018
20:11:13
Ой

Alexander
03.04.2018
20:12:14
а есть статья на тему почему это так работает?

Dmitry
03.04.2018
20:13:10
Я набрёл только на Thinking Functionally with Haskell
by Richard Bird

Google

Dmitry
03.04.2018
20:13:41
9.2 Cycling list

Pineapple
03.04.2018
20:14:51
Или циклический лист должен оставаться циклическим после fmap f?

Alexander
03.04.2018
20:15:54
{-# LANGUAGE BangPatterns #-}
data Cycle a = a :> Cycle a
| E (Cycle a)
fromList :: [a] -> Cycle a
fromList xs = let z = build z xs in z where
build e (x:xs) = x :> build e xs
build e [] = E e
period :: Cycle [a] -> Int
period = go 0 where
go !c (_:>as) = go (c+1) as
go c (E _) = c
tie :: Cycle a -> Cycle a -> Cycle a
tie x xs = let z = build z xs in z where
build z (_:>as) = build z as
build z (E _) = E z
insert' :: Int -> a -> Cycle a -> Cycle a
insert' i v xs = let z = build z i xs in z where
build e 0 t = v :> tie e t
build e n (E _) = error "FOOO"
build e n (a:>as) = a :> build e (n-1) as
вот вам циклический список
не рекомендую пользоваться такой структурой правда

Alexander
03.04.2018
20:18:47

Alexander
03.04.2018
20:19:08
вот список выше останется циклическим после fmap
какие вообще проблемы у fmap и бесконечного списка?!
точнее не так, какие проблемы у fmap и *любого* списка в Haskell

Pineapple
03.04.2018
20:20:12
Ничего не будет, но потом, когда отфорсят весь список

Alexander
03.04.2018
20:20:47

Alexander
03.04.2018
20:20:58
ну давай напишу, что сложно чтоли
да и ты напишешь без труда
instance Functor Cycle where
fmap f xs = let z = build z xs in z where
build z (a :> as) = f a :> build z as
build z (E _) = E z
законы проверять будешь?

Alexander
03.04.2018
20:23:15
верю на слово!

Alexander
03.04.2018
20:24:17
кстати вот как правильно написать Eq я даже не знаю
наверное найти у обоих хвост и потом стравнивать до следующего?

Pineapple
03.04.2018
20:24:47
Можно собрать циклический список, который не будет выполнять. Надо прятать конструктор
Думаю так

Google

Alexander
03.04.2018
20:25:07
да, конструктор тут спрятан должен быть

Dmitry
03.04.2018
20:25:21
А E (Cycle a) что значит?

Alexander
03.04.2018
20:25:53
кстати, а почему нельзя было просто сделать newtype конечного списка и прописать Functor и прочие инстансы?

Alexander
03.04.2018
20:26:12
конструктор данных E с полем в котором значение типа Cycle a

Dmitry
03.04.2018
20:26:39
А смысл?

Alexander
03.04.2018
20:27:03
сделать циклический список
со всеми свойствами цикличности, учитывая модификации

Dmitry
03.04.2018
20:27:27
Нет, каков смысл такой конструкции?

Alexander
03.04.2018
20:27:32
я не понимаю..
вообще смысл чтобы явно был терминатор списка, и мы знали что дальше по кругу идти не надо
при всяких модификациях списка и т.п.

Dmitry
03.04.2018
20:28:42
Ты в коде везде отбрасываешь значение внутри конструктора E. Зачем внутри тогда значение типа Cycle?

Alexander
03.04.2018
20:29:11
везде написанных методах
там же только мутации
давай напишу toList ?
не, лучше unroll назову

Pineapple
03.04.2018
20:30:41
unloop

Alexander
03.04.2018
20:30:44
хм.. хотя для unroll он тоже не нужен

Dmitry
03.04.2018
20:30:57
Почему нельзя в объявлении типа заменить E (Cycle a) на E?

Alexander
03.04.2018
20:30:58
для зиппера какого-нить нужен, или uncons

Google

Alexander
03.04.2018
20:31:14
потому, что у тебя в руках может не быть головы

Pineapple
03.04.2018
20:31:19
E нужен для tail & Co

Alexander
03.04.2018
20:31:43
представь цикл [1,2,3,<loop>]
если ты его раскручиваешь то будет [1,2,3,1,2,3...
если я тебе дам его начиная с двойки
то после раскручивания должно быть [2,3,1,2,3...]
uncons :: Cycle a -> (a, Cycle a)
uncons (a :> as) = (a, as)
uncons (E as) = uncons as

Dmitry
03.04.2018
20:33:57
О. Я понял. Спасибо.

Alexander
03.04.2018
20:34:29
но если честно я не знаю ни одного юзкейса для такой структуры
если найдется, то нужно ввести ещё forceSpine метод
который будет форсить структуру, чтобы не утонуть в персистентности

Dmitry
03.04.2018
20:42:24

Alexander
03.04.2018
20:43:14
в мутальном языке для всяких циклических буфферов я смысл вижу

Dmitry
03.04.2018
20:50:39

Alexander
03.04.2018
20:51:12
За бесконечное время

Namdak
03.04.2018
20:54:43
Cycle может использоваться для генерации бесконечного циклического списка квантов планировщика. Вот пример на Rust https://gist.github.com/5HT/6a9923c78c1e1c3d358b271b882dfa1e

Alexander
03.04.2018
20:55:39
ну для cycle я вижу много использований
но то, что создается в haskell с помощью cycle - это просто бесконечный список в компактной форме
блин я был побит coerce-ом

Google

Alexander
03.04.2018
22:18:07
который safe

Hot
04.04.2018
06:02:46
Вообще я правильно понял, что всякие манипуляции над любыми синтаксическими структурами - это типовые задачи для Haskell?

Aleksey
04.04.2018
06:08:58
Хаскель - общего назначения. На нём всё можно :)
Но да, околопарсерное на нём пишут часто
Как и на OCaml
Просто потому что удобно парсер-комбинаторы и реализовывать и использовать

Yuriy
04.04.2018
06:13:20
Хаскель — типовой язык для этой задачи

Hot
04.04.2018
06:14:09
Последняя формулировка агонь :)

Dmitry
04.04.2018
06:14:49
ну в общем-то так и есть. я вот пытался комбинаторные парсеры писать на си, то еще развлечение, доложу я вам

Андрей
04.04.2018
08:02:57
"Черт побери, я совсем не знаю что такое хаскель, но о нем все так вкусно рассказывают, что в моем личном графике учебы он уже на одних из ближайших позиций после JS" (С)

Hot
04.04.2018
08:04:51
Спасибо, поржал.

Александр
04.04.2018
08:05:54
У меня есть крошечное хобби. Я собираю список известных плюсовиков, которые переметнулись в Haskell и начали оттуда таскать всякие ништяки.

Yuriy
04.04.2018
08:09:48

Aragaer
04.04.2018
08:11:54
у меня есть целая куча идей, чего бы можно было накодячить
но почему-то не знаю, что из этого стоит пилить на хаскеле
"прям щас" пишу прототип проги на лиспе, которую потом буду переделывать на раст.

Leonid
04.04.2018
08:12:43
но зачем?

Aragaer
04.04.2018
08:13:28
там цель - получить минимальную либу, которую потом можно было бы закатать в консольное приложение или же на андроид

Yuriy
04.04.2018
08:13:28
кстати, о парсерах.
Хаскель хорошо подходит для задачи написания парсера, если язык не важен. но что если я хочу сделать парсер на С++ или JS? я могу написать парсер на Парсеке или аналоге и интерпретировать его в код на другом языке?

Aragaer
04.04.2018
08:13:43
вот. А мне парсить особо нечего

Yuriy
04.04.2018
08:14:32