LINUX.ORG.RU

Как на хаскеле разбить строку?

 ,


0

2

В общем, нужна операция, типа как в других языках, что-то вроде,

"Hello,How,Are,You,Today".split(",").join(".")
Пока нашел вот это решение
splitBy :: (a -> Bool) -> [a] -> [[a]]
splitBy _ [] = []
splitBy f list = first : splitBy f (dropWhile f rest) where
  (first, rest) = break f list
 
splitRegex :: Regex -> String -> [String]
 
joinWith :: [a] -> [[a]] -> [a]
joinWith d xs = concat $ List.intersperse d xs
-- "concat $ intersperse" can be replaced with "intercalate" from the Data.List in GHC 6.8 and later
 
putStrLn $ joinWith "." $ splitBy (== ',') $ "Hello,How,Are,You,Today"
 
-- using regular expression to split:
import Text.Regex
putStrLn $ joinWith "." $ splitRegex (mkRegex ",") $ "Hello,How,Are,You,Today"

Но, что-то, не особо мне нравится. Может что получше есть?



Последнее исправление: sadlinuxoid (всего исправлений: 1)

Это аноанiмус, если что, поэтому такое глупое сообщение.

anonymous
()
Ответ на: комментарий от sadlinuxoid

То есть ты вбрасываешь то, что тебе не нужно чисто ради троллинга, отказываешься смотреть в мануалы, отказываешься гуглить и считаешь себя правым? Ок.

x3al ★★★★★
()
Ответ на: комментарий от true_admin

Ну, или так:). Только тогда

"foo,bar,baz".replace(/,/g, ".")

sadlinuxoid
() автор топика

Как на хаскеле разбить строку?

на хаскеле не бьют строки, это задача не для математического ума

umren ★★★★★
()

лол! чтобы сделать split надо отдельный пакет ставить!

anonymous
()
map (\c -> if c == ',' then '.' else c) "Hello,How,Are,You,Today"

А split'а в стандартной библиотеке и правда нет, сорь.

KblCb ★★★★★
()
Prelude Data.List.Split Data.List> "Hello,How,Are,You,Today" .  splitOn "," . intercalate "."
"Hello.How.Are.You.Today"

так?

или

Prelude> "Hello,How,Are,You,Today" .  map (\x -> if x == ',' then '.' else x)
"Hello.How.Are.You.Today"

. тут переопределен немного

qnikst ★★★★★
()
Последнее исправление: qnikst (всего исправлений: 2)
Ответ на: комментарий от qnikst

Data.List.Split Data.List

какой ужос. А если мне операция нужна только 1 - 2 раза, можно память как-то освободить от загруженных пакетов?

или

Да не, это как-бы, больше похоже на replace(/,/g, ".")

sadlinuxoid
() автор топика
Ответ на: комментарий от sadlinuxoid

какой ужос. А если мне операция нужна только 1 - 2 раза, можно память как-то освободить от загруженных пакетов?

Haskell как бы компилируется. А как в интерпретируемых динамических говноязыках убрать все неиспользуемые методы у той же строки, чтобы они не занимали память?

x3al ★★★★★
()
Ответ на: комментарий от x3al

А как в интерпретируемых динамических говноязыках годных языках убрать все неиспользуемые методы у той же строки, чтобы они не занимали память?

Просто удалить ссылку. Метод подберется GC.

sadlinuxoid
() автор топика
Ответ на: комментарий от sadlinuxoid

У меня есть 3 миллиона строк. Мне не нужно делать replace() и прочую фигню в них. Как удалить replace у строк? Твой вопрос точно того же уровня.

И да, удачи удалять встроенные батарейки.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Странный ты какой-то. Сначала спрашиваешь как удалить неиспользуемые методы, а когда тебе показывают, заявляешь, вау, ты их удалил, а они ведь используются!!! Ты уж определись, что ты хочешь удалять на самом деле.

sadlinuxoid
() автор топика
Ответ на: комментарий от sadlinuxoid

когда тебе показывают, заявляешь, вау, ты их удалил, а они ведь используются

Я хочу удалить методы, не строки. Ты просишь ровно того же.

x3al ★★★★★
()
Ответ на: комментарий от x3al
'a'.charAt();
> "a"

delete String.prototype.charAt;
> true

'a'.charAt(0)
> Uncaught TypeError: "0".charAt is not a function(…)
Ja-Ja-Hey-Ho ★★★★
()
Ответ на: комментарий от x3al

откуда ты знаешь? А даже если так, встроенные методы хорошо оптимизированы, нет смысла их удалять. Речь шла о подключаемых, юзер левел вещах, а ты влез тут с нейтивом не в кассу.

sadlinuxoid
() автор топика
Ответ на: комментарий от sadlinuxoid

откуда ты знаешь?

Оттуда, что ни в одной реализации JS встроенные строки не написаны на JS.

Речь шла о подключаемых, юзер левел вещах, а ты влез тут с нейтивом не в кассу.

Расшифруй аббревиатуру GHC, особенно последнюю букву там.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Оттуда, что ни в одной реализации JS встроенные строки не написаны на JS.

А свтроенные строки какое к этому отношение имеют? Ты ведь удаляешь ссылку из прототипа строки, который не является встроенным примитивом.

sadlinuxoid
() автор топика
Ответ на: комментарий от sadlinuxoid

Речь шла о подключаемых, юзер левел вещах, а ты влез тут с нейтивом не в кассу.

Data.List — native и, соответственно,

хорошо оптимизированы, нет смысла их удалять

и никаких

какой ужос. А если мне операция нужна только 1 - 2 раза, можно память как-то освободить от загруженных пакетов?

x3al ★★★★★
()
Ответ на: комментарий от x3al

не надо ему ничего объяснять, поведение плохое, не заслужил

anonymous
()
Ответ на: комментарий от hateyoufeel

Каким образом?

Обычным образом. Что за вопрос? Модуль не висит в памяти, память не занята, что тебе пояснить?

sadlinuxoid
() автор топика
Ответ на: комментарий от sadlinuxoid

Поясни как в компилируемом языке, компилятор которого выкидывает неиспользуемый код при собственно компиляции, модуль будет висеть в памяти.

hateyoufeel ★★★★★
()
Ответ на: комментарий от sadlinuxoid

А что, у скомпилированной программы нет рантайма?

Выкидывать модули из программы в рантайме? А потом подгружать. А потом выкидывать опять. Подгружать-выкидывать, подгружать-выкидывать, вверх-вниз, вверх-вниз, ммммм...

P.S. На самом деле, можно использовать динамический линкер из GHC чтоб подгружать и выгружать целые модули в рантайме, но такое мало кто делает ввиду отсутствия необходимости.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

выкидывает неиспользуемый код

Что значит неиспользуемый код, кстати, в данном контексте, поясни пожалуйста. Допустим, я подключил 2 модуля, foo и bar. Прога скомпилировалась, запустилась, ждем юзеринпута. Если юзер ввел foo, bar нужен, удаляем. Откуда компилятор знает, какой код используемый, а какой - нет? Иными словами, откуда ему знать, что введет юзер?

sadlinuxoid
() автор топика
Ответ на: комментарий от sadlinuxoid

Что значит неиспользуемый код, кстати, в данном контексте, поясни пожалуйста.

Есть модуль типа такого:

module Foo (bar,baz) where

bar x = dee (x + 1)
dee x = x - 1
baz x = x + 11
doo x = x + 10

Т.к. на doo нет ни одной ссылки из экспортируемых функций, в готовом бинарнике её не будет.

hateyoufeel ★★★★★
()
Ответ на: комментарий от sadlinuxoid

Ну сделай munmap ручками, бедняжка. Заодно может распорешь себе срачельник сегфолтами и перестанешь срать в development.

Deleted
()
Ответ на: комментарий от hateyoufeel

bloated пакет с кучей зависимостей и далеко не идеальными решениями. В целом есть и полезные функции, но добавление в реальный пакет зависимостью вызовет кучу проблем. (highlight postman)

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

Даже в unix весьма не идеальные решения. Одни булевые флаги open() чего стоят. Я вообще думаю, что его проще с нуля переписать.

kirk_johnson ★☆
()

А как разбить строку, например, на C? Не всем языкам повезло с вагоном батареек.

Для представления текстовой информации в Х. можно использовать три различных типа данных: String, ByteString и Text.

String — самый обычный список юникодных кодпоинтов, со всеми достоинствами и недостатками присущими этому решению.

ByteStrnig — кусок т.н. «фиксированной памяти» (т.е. сборщик мусора не может её перемещать). Короче, всё как в C, только выделяется быстрее.

Text — кусок нефиксированной памяти (т.е. сборщик мусора может её перемещать). В отличие от байтстрингов, является массивом юникодных кодпоинтов.

ByteString и Text существуют в Strict и Lazy вариантах. Тут очень легко запомнить т.к. если ByteString — строгий, то [ByteString] — нестрогий. То же самое и с Text.

Кстати, Lazy версия Text существует исключительно по историческим причинам.

Самым сложным пакетом из всех вышеперечисленных является text. Тут и неявный стриминг для большого подмножества базовых функций, и реализация эффективного поиска, и богатый интерфейс на все случаи жизни, и низкоуровневые крутайки и т.д.

Может показаться странным, но никакого оверблоатинга или избыточности нет. Каждый пакет решает свою задачу.

Теперь ближе к теме. Почему в хаскеле нет splitOn? Два слова: аппликативные парсеры. На хаскеле *очень* легко пишутся LL парсеры. Поэтому, тебе лучше смотреть в их сторону. Раньше был популярен parsec. Теперь, в моду вошел attoparsec — рассадник заболевания под названием «аппликатиный стиль головного мозга». Есть uu-parsinglib — академический привет из Утрехта. Есть trifecta за авторством Эдварда Кметта: с красивой цветной диагностикой и кучей матана внутре.

Аппликативными парсерами зачастую злоупотребляют. Но, поскольку с вероятностью близкой к 1 у тебя в зависимостях будет аттопарсек, ну ты понял...

P.S. А поддержка юникода в GHC — хреновая.

Macil ★★★★★
()

Если тебе на самом деле нужно работать не со списками символов, а с текстом, то:

{-# LANGUAGE OverloadedStrings #-}
import Data.Text

replace "," "." "Hello, How, Are, You, Today"
zinfandel ★★
()
Последнее исправление: zinfandel (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.