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
ну то есть в массиве туплей каждый тупль будет состоять из чара и референса на объект с интом
Ilya
Ayrat
тупль в фшарпе иммутабельный, поэтому единственный способ обойти, сделать свою структуру с мутабельным полем
Ayrat
но особо хитрого
Ayrat
на самом деле оно позволяет сделать что угодно мутабельным
Ilya
FSharpRef яснопонятно
Ayrat
ну просто утаскивание на кучу
Ayrat
чтобы передавать по ссылке
Ayrat
Ayrat
я ж пишу = ref 1
Ayrat
у нее даже тип другой, ты инт в инт реф не засунешь
Ayrat
или наоборот
Ayrat
Ayrat
потому что он пришел из окамла)))
Ilya
Ayrat
а в него пришел хз откуда
Ayrat
это легаси и не стоит юзать
Ayrat
поэтому я хотел сделать на byref
Ayrat
но байреф там чот сложно
Ayrat
там самая большая сложность в захвате байрефов в лямбде. Если переписать на цикл без лямбды все збс, да
Igor
Ayrat
нот бед
Mark
а если строка пустая?)
Vasily
Тоже норм вариант, кстати
Igor
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
Всем спасибо за поддержку и добрые слова.
Igor
Поздравляю! ну рассказывай
Igor
все таки смог перевернуть массив значит))
Tako
скоро Василий всех возьмет на работу и чат переименуем в /work
Ilya
Anonymous
Anonymous
еще при жизни
Igor
Главное что бы токсиком не стал, на почве мобилок
Анна
Tako
где Василий будет сидеть на #
gsomix
Всем большое спасибо!
Anatoly
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
Hog
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
а чо, в Имаксе нельзя код покрасить кастомно? Не верю! - с упреком вздухнул Станиславский.
Anonymous
хз, я как-то ваще не чувствителен к раскраске. мне наверно и минимум цветов хватит.
Андрей
Дон читает по-русски https://twitter.com/dsymetweets/status/1358706912834056192?s=21