Ayrat
вот так катит, да. Но тут еще в тупликах дополнительная аллокация торчит "aaaabbbcca" |> Seq.fold(fun (acc: ResizeArray<char * int ref>) char -> if acc.Count > 0 then let (oldChar, oldCounter) = acc.[acc.Count - 1] if oldChar = char then oldCounter := !oldCounter + 1 else acc.Add (char, ref 1) else acc.Add (char, ref 1) acc ) (ResizeArray())
Ayrat
ну то есть в массиве туплей каждый тупль будет состоять из чара и референса на объект с интом
Ayrat
тупль в фшарпе иммутабельный, поэтому единственный способ обойти, сделать свою структуру с мутабельным полем
Ayrat
а что за объект с интом?
реф на куче. что-то вроде явного боксинга
Ayrat
но особо хитрого
Ilya
реф на куче. что-то вроде явного боксинга
можешь супер маленький пример на шарплабе показать?
Ayrat
на самом деле оно позволяет сделать что угодно мутабельным
Ayrat
можешь супер маленький пример на шарплабе показать?
https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AbEAzAzgHwxgBcACAWwFdiBDYI0m0gXlNm1IEYBYAKD6YhWAJj58AygE9cxGOQB0AYQgA7XBCLyA6lACWsgDK6VMUgEIaQA===
Ilya
FSharpRef яснопонятно
Ayrat
ну просто утаскивание на кучу
Ayrat
чтобы передавать по ссылке
Ilya
ну просто утаскивание на кучу
вот это странно - когда ссылка утекает на кучу не в боксинге, это вызывает вопросы)
Ayrat
я ж пишу = ref 1
Ayrat
у нее даже тип другой, ты инт в инт реф не засунешь
Ayrat
или наоборот
Ilya
у нее даже тип другой, ты инт в инт реф не засунешь
есть ведь tracking reference которые для ref return, я думал оно может использовать такой же механизм
Ayrat
потому что он пришел из окамла)))
Ayrat
а в него пришел хз откуда
Ayrat
это легаси и не стоит юзать
Ayrat
поэтому я хотел сделать на byref
Ayrat
но байреф там чот сложно
Ayrat
там самая большая сложность в захвате байрефов в лямбде. Если переписать на цикл без лямбды все збс, да
Ayrat
нот бед
Mark
а если строка пустая?)
Vasily
точно! Тогда так:
Тоже норм вариант, кстати
Vasily
Seq.empty жи
Anonymous
йа тоже могу, выебистая версия
Anonymous
let input = "aaabbbcca" let rec partitionWhile pred list taken = match list with | [] -> taken, [] | item :: list' when pred item -> partitionWhile pred list' (item :: taken) | item :: list' -> taken, list' let rec solve input res = match input with | [] -> List.rev res | expectedChar :: input' -> let taken, input' = partitionWhile (fun actualChar -> actualChar = expectedChar) input' [] solve input' ((expectedChar, List.length taken + 1) :: res) printfn "%A" (solve (List.ofSeq input) [])
Anonymous
(я не знаю зачем я это сделал)
gsomix
уже на новой работе?
А вот теперь уже на новой.
gsomix
Всем спасибо за поддержку и добрые слова.
Igor
Поздравляю! ну рассказывай
gsomix
Поздравляю! ну рассказывай
У Василия в команде буду трудиться.
Igor
все таки смог перевернуть массив значит))
Tako
скоро Василий всех возьмет на работу и чат переименуем в /work
Igor
У Василия в команде буду трудиться.
Добро пожаловать в android разработку, buddy 😌
Ilya
У Василия в команде буду трудиться.
Будешь расширять кругозор?
Anonymous
Добро пожаловать в android разработку, buddy 😌
а потом мы все скинемся ему на медный памятник
Anonymous
еще при жизни
Igor
Главное что бы токсиком не стал, на почве мобилок
Tako
где Василий будет сидеть на #
Vladimir
У Василия в команде буду трудиться.
мои поздравления и пожелания успехов)
gsomix
Всем большое спасибо!
Vladyslav
я, конечно, ща отхвачу за код не на F#, но вышеупомянутая задача красиво решает с помощью паттерн матчинга где можно указывать константы (по-моему где-то даже был реквест на это) def solve(list, {c, count}=state, arr) do case list do [] -> Enum.reverse([state | arr]) [^c | xs] -> solve(xs, {c, count + 1}, arr) [x | xs] -> solve(xs, {x, 1}, [state | arr]) end end
Igor
ага, хотя там была не задачка а шутка
Tako
я уже сам ели сдерживаюсь!!
Vladyslav
была, медленно!
Doge
Можно всё это сделать и чисто, и быстро, но нужны тогда лин/афинные типы
Doge
Типы, значения который можно использовать только один раз (линейные) или максимум один раз (афинные). В таком случае внутри функции, которая принимает линейный аргумент и его возвращает, его можно спокойно мутировать, сохраняя чистоту всего построения, потому что в таком случае известно, что никто кроме этой функции этим значением не владеет при её исполнении
Doge
На афинных типах построен раст, а линейные вот сейчас буквально добавили в хаскель
Doge
Плюс ещё второй идрис имеет обобщенный вариант таких типов, где вообще можно произвольное число использований назначить типу
Doge
У меня есть, но это скорее часть инфраструктуры + некоторые прототипные вещи.
Doge
Рад бы больше его использовать, но я что-то стал слишком байтоебом для хаскеля
Doge
Раньше было сильно хуже, сейчас хаскель в vscode стал более-менее приемлимым для использования.
Doge
Было плохо, сейчас на самом деле ощутимо лучше стало.
Doge
Раньше из разумных вариантов - были емаксовый плагин, либо упоротый и странный плагин к идее
Doge
Теперь есть LSP нормальный
Igor
Igor
ну там еще второй вариант
Igor
ну и чо. функция чистая?
Doge
Хаскель вне своего рантайма и компилятора - это относительно бессмысленная штука
Doge
Ленивые языки на обычных рантаймах плохо себя покажут, если только не пойти в whole program optimization + defunctionalization как в каком-нибудь GRIN
Doge
Вопрос в том, что скорость работы ощутимо просядет.
Anonymous
Vasily
Ничо, будешь преподом в институте
Ilya
Цветной, как последний срок наркомана?
Anonymous
а чо, в Имаксе нельзя код покрасить кастомно? Не верю! - с упреком вздухнул Станиславский.
Vlæd
а чо, в Имаксе нельзя код покрасить кастомно? Не верю! - с упреком вздухнул Станиславский.
Можно, но скорее всего для этого свой derived mode надо будет писать. Ну или если быстро хакнуть - делать buffer-local фейсы.
Anonymous
хз, я как-то ваще не чувствителен к раскраске. мне наверно и минимум цветов хватит.
Андрей
Дон читает по-русски https://twitter.com/dsymetweets/status/1358706912834056192?s=21