@haskellru

Страница 1056 из 1551
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
let xs = a : b : c : xs in xs ?
Этот вариант разве не эквивалентен cycle [a,b,c]?

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
Ой

Этот вариант разве не эквивалентен cycle [a,b,c]?
А в каком смысле тогда эти выражения эквивалентны?

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
Или циклический лист должен оставаться циклическим после fmap f?
я вот считаю, что циклический список бесконечен, поэтому после fmap не должно быть уже ничего, даже звезд и черных дыр

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
в мутальном языке для всяких циклических буфферов я смысл вижу

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 и начали оттуда таскать всякие ништяки.

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
вот. А мне парсить особо нечего
я не в контексте ответа на твой вопрос, извини

Страница 1056 из 1551