169 похожих чатов

Я не магистр хаскеля, но разве не может лейзи тип

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

100 ответов

304 просмотра

нет, типы на ходу не меняются неявно

LazyByteString и StrictByteString это структурно разные типы

deadgnom32-λ yorozuya Автор вопроса
Cheese Syrowiecki
нет, типы на ходу не меняются неявно

ну может тогда простое решение, это впихнуть в этот параметр явную конвертацию при вызове функции

Nutritional Rabbit
LazyByteString и StrictByteString это структурно р...

Грубо говоря type LazyByteString= [StrictByteString]

deadgnom32 λ yorozuya
ну может тогда простое решение, это впихнуть в это...

да, так можно, но в данном случае, скорее всего, лучше просто одним типом пользоваться везде

Cheese Syrowiecki
да, так можно, но в данном случае, скорее всего, л...

как если кондуит возращает ByteString а TagSoup хочет String c этим и вожусь

вот например или я чего то не понимаю parseTree :: StringLike str => str -> [TagTree str] Build a TagTree from a string.

Fedor
вот например или я чего то не понимаю parseTree :...

здесь нет явного указания на тип String

Fedor
вот например или я чего то не понимаю parseTree :...

здесь str — типовая переменная, она может принимать значение любого типа, удовлетворяющего условию

Cheese Syrowiecki
здесь нет явного указания на тип String

а StringLike => надо же быть инстансем

Fedor
а StringLike => надо же быть инстансем

именно. посмотри, какие типы принадлежат этому классу

Cheese Syrowiecki
именно. посмотри, какие типы принадлежат этому кла...

Там есть инстансы для моих типов, но что то не то, этого я пока и не могу понять

Fedor
Там есть инстансы для моих типов, но что то не то,...

OverloadedStrings уже включил, как советовали несколько раз?

Fedor
Да

какая ошибка после этого?

Cheese Syrowiecki
какая ошибка после этого?

app/Main.hs:97:74: error: [GHC-83865] • Couldn't match type ‘B.ByteString’ with ‘[Char]’ Expected: String Actual: B.ByteString • In the second argument of ‘($)’, namely ‘L.toStrict resp’ In the second argument of ‘($)’, namely ‘fromString $ L.toStrict resp’ In the second argument of ‘($)’, namely ‘parseTree $ fromString $ L.toStrict resp’ | 97 | let tags = flattenTree $ universeTree $ parseTree $ fromString $ L.toStrict resp код в котором она spjPapers :: IO String spjPapers = do resp <- getHtml testUrl let tags = flattenTree $ universeTree $ parseTree $ fromString $ L.toStrict resp let links = map f $ sections (~== "<A>") $ takeWhile (~/= "<a name=haskell>") $ drop 5 $ dropWhile (~/= "<a name=current>") tags pure $ unlines links where f :: [Tag String] -> String f = dequote . unwords . words . fromTagText . head . filter isTagText dequote ('\"':xs) | last xs == '\"' = init xs dequote x = x вот так и происходит версия, что нужны тейквайл из байтстринга - не прошла, тоже ошибки, да и по ним понятно что дропы работают с листом Тегов

Cheese Syrowiecki
какая ошибка после этого?

при этом есть такое Instances StringLike String StringLike ByteString StringLike ByteString StringLike Text StringLike Text

Fedor
app/Main.hs:97:74: error: [GHC-83865] • Couldn...

ну вот ты выход toStrict подаёшь на вход fromString. а какие типы на самом деле на выходе из toStrict и на входе fromString?

Cheese Syrowiecki
ну вот ты выход toStrict подаёшь на вход fromStrin...

fromString :: IsString a => String -> a toStrict :: LazyByteString -> StrictByteString Есть еще конечно toString но мне кажеться это уж совсем перебор

Fedor
fromString :: IsString a => String -> a toStrict...

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

да просто считал что ByteString инстансе IsString

Cheese Syrowiecki
ты пытаешься из зайца сделать белку, а потом из ме...

Реально я хочу строку пришедшую из кондуита (getResponseBody ) отдать TagSoupe - но пока упираюсь в типы, я понимаю, что что то не понимаю, но пока не понимаю, что, версия только что надо применить что то типа decodeUtf8

Cheese Syrowiecki
Response откуда берёшь? httpLbs?

дв - вот код getHtml :: Url -> IO HtmlByte getHtml url = let request = buildRequest domainBS pathBS (domainBs, pathBS) = urlFor url in do resp <- httpLBS request let status = getResponseStatusCode resp if status == 200 then do let body = getResponseBody resp pure body else do pure ""

Fedor
дв - вот код getHtml :: Url -> IO HtmlByte getHtml...

получается что у тебя есть LBS, и parseTree принимает LBS. зачем конвертировать?

Cheese Syrowiecki
Response откуда берёшь? httpLbs?

или надо как то это использовать httpSource

Cheese Syrowiecki
получается что у тебя есть LBS, и parseTree приним...

parseTree принимает, но потом c tags конфликт типов

Fedor
parseTree принимает, но потом c tags конфликт тип...

ок, разобрались. давай следующую ошибку

Cheese Syrowiecki
ок, разобрались. давай следующую ошибку

вот тогда код такой spjPapers :: IO String spjPapers = do resp <- getHtml testUrl let tags = flattenTree $ universeTree $ parseTree resp let links = map f $ sections (~== "<A>") $ takeWhile (~/= "<a name=haskell>") $ drop 5 $ dropWhile (~/= "<a name=current>") tags pure $ unlines links where f :: [Tag String] -> String f = dequote . unwords . words . fromTagText . head . filter isTagText dequote ('\"':xs) | last xs == '\"' = init xs dequote x = x Ошибка опять в типах но уже относительно tags app/Main.hs:100:65: error: [GHC-83865] • Couldn't match type ‘L.ByteString’ with ‘[Char]’ Expected: [Tag String] Actual: [Tag HtmlByte] • In the second argument of ‘dropWhile’, namely ‘tags’ In the second argument of ‘($)’, namely ‘dropWhile (~/= "<a name=current>") tags’ In the second argument of ‘($)’, namely ‘drop 5 $ dropWhile (~/= "<a name=current>") tags’ | 100 | drop 5 $ dropWhile (~/= "<a name=current>") tags

Cheese Syrowiecki
откуда берётся HtmlByte?

HtmlByte это алиас его местный

Fedor
вот тогда код такой spjPapers :: IO String spjPap...

перепиши код так, чтобы он работал только с LBS, без смешивания со String. в частности, сигнатура f мешает

Fedor
На type HtmlByte = L.ByteString

но строка — это не один байт

Fedor
На type HtmlByte = L.ByteString

наверно, ты хотел написать HtmlBytes

Cheese Syrowiecki
перепиши код так, чтобы он работал только с LBS, б...

вот вопрос такое работает [x | x@(TagBranch "a" _ _) <- universeTree tree] а нужно добавить условие на атрибуты, и я туплю, как это сделать например нужно, чтоб в выдаваемом теге был aria-label="More results", но не соображаю как проверить, или это нельзя просто сделать ?

Fedor
вот вопрос такое работает [x | x@(TagBranch "a" _ ...

гм, ты же 2 недели назад уже решил эту задачу

Danil Berestov
> [x | x <- [1..10], x `mod` 2 == 0] [2,4,6,8,10]

Да так все работает, вопрос про x@(TagBranch "a" _ _ )

Cheese Syrowiecki
гм, ты же 2 недели назад уже решил эту задачу

Да даже нашел код, но уже сам внем путаюсь.... Так что буду думать как решить, чтоб было понятно хотябы мне )))

Cheese Syrowiecki
https://t.me/haskell_learn/117810

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

Fedor
да и решил ее криво, результаты парсил, самостояте...

ну решил же! это круто! теперь, когда есть решение, можно его улучшать, оптимизировать а как хотелось?

Cheese Syrowiecki
ну решил же! это круто! теперь, когда есть решение...

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

Cheese Syrowiecki
ну решил же! это круто! теперь, когда есть решение...

хотелось примерно то что сейчас получается, еще не очень красиво, но хоть понятно nextAttr = [(TE.encodeUtf8 "aria-label", TE.encodeUtf8 "Ещё результаты" )] linkAttr = [(TE.encodeUtf8 "jsname", TE.encodeUtf8 "UWckNb" )] --spjPapers :: IO [String] spjPapers = do resp <- getHtml testUrl B.writeFile "test.thml" resp let tree = parseTree resp utree = universeTree tree next = [x | x@(TagBranch tagName attrs innerTag) <- utree , ((tagName == "a" ) && (arrIn nextAttr attrs))] links = [x | x@(TagBranch tagName attrs innerTag) <- utree , ((tagName == "a" ) && (arrIn linkAttr attrs))] pure $ (links, next)

Fedor
ну сейчас, я вполне выдергиваю теги с линками и те...

universeTree + фильтруешь по тэгу "a" и атрибуту "href"

Fedor
хотелось примерно то что сейчас получается, еще не...

next = [x | x@(TagBranch tagName attrs innerTag) <- utree , ((tagName == "a" ) && (arrIn nextAttr attrs))] -- давай сразу перепишем красиво next = [ x | x@(TagBranch "a" attrs _) <- utree , arrIn nextAttr attrs ]

Cheese Syrowiecki
next = [x | x@(TagBranch tagName attrs innerTag) <...

тут была мысль сделать функцию с параметрами а не делать сразу конкретный список

Cheese Syrowiecki
что такое arrIn?

вот такое, не лучшее, но работает arrIn :: Eq a => [a] -> [a] -> Bool arrIn xs [] = False arrIn [] ys = True arrIn (x:xs) ys = if x `elem` ys then arrIn xs ys else False

Cheese Syrowiecki
if a then b else False === a && b

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

Fedor
если не лень, это была попытка проектирования свер...

отформатируй код с помощью fourmolu или ormolu

Fedor
сейчас попробую заставить коде

лучше в консольке запустить, а украшательством vscode потом заняться

Fedor
если не лень, это была попытка проектирования свер...

(SearchAtom search searchDomain tsnew) == SearchAtom search searchDomain tsnew с этим hlint помогает

Fedor
если не лень, это была попытка проектирования свер...

if (y == x) then True else memb x ys === if y == x then True else memb x ys === y == x || memb x ys

Cheese Syrowiecki
(SearchAtom search searchDomain tsnew) == SearchAt...

А как помогает ? и как его привязать

Cheese Syrowiecki
memb = elem

Да я видел, просто от куда то притащил. они странные и не нужные, но пока были.... Думал пригодятся, но нет

Fedor
А как помогает ? и как его привязать

запусти в терминале hlint Main.hs и посмотри

Fedor
вроде включил ормолоу

mconcat [ts1, ts2] === ts1 <> ts2

Cheese Syrowiecki
запусти в терминале hlint Main.hs и посмотри

такого типа коменты ? app/Main.hs:21:23-42: Suggestion: Redundant bracket Found: (map (process time)) <$> searchList Perhaps: map (process time) <$> searchList

Cheese Syrowiecki
mconcat [ts1, ts2] === ts1 <> ts2

не уверен, что реализовано Semigroup для TS

Fedor
вроде включил ормолоу

T.Text писать постоянно некрасиво, лучше import Data.Text qualified as Text import Data.Text (Text) и дальше везде просто тип Text и функции типа Text.length

Fedor
не уверен, что реализовано Semigroup для TS

ты же пользуешься mconcat из Semigroup

Fedor
вроде включил ормолоу

if _ then True else False -- это совсем смешно. не показывай такое людям

Fedor
не уверен, что реализовано Semigroup для TS

В репле можно так посмотреть: > :i Monoid type Monoid :: * -> Constraint class Semigroup a => Monoid a where ... То есть чтобы у вас определён моноид, должна быть определена полугруппа. Кроме того, можно было бы набрать :i TS и получить список инстансов.

Fedor
вроде включил ормолоу

arrIn -- плохое название. оно же не с массивами работает. подобная функция есть для других типов под названием isSubsetOf, и тут можно такое же имя использовать

Fedor
вроде включил ормолоу

nextAttr = [(TE.encodeUtf8 "aria-label", TE.encodeUtf8 "Ещё результаты")] вот тут было бы красиво написать nextAttr = [("aria-label", "Ещё результаты")] и это даже будет правильно работать со строкой "aria-label", потому что мы работаем с байтами, и для латиницы байты с символами совпадают. но для строки "Ещё результаты" будет ошибка, потому что мы работаем с байтами, а кириллица байты не описывает (или описывает неправильно). что делать? можно, например, перевести байты из сети в юникод пере парсингом. но мне вот больше нравится с байтами работать, а с кириллицею не работать, поэтому я бы запрашивал гугл в английской локали и оставлял байтами.

Fedor
вроде включил ормолоу

(pos + (length urlList)) === pos + length urlList

Fedor
вроде включил ормолоу

foldr (\(x, y) xs -> if x == "href" then y : xs else xs) [] attrs === map (\(x, y) -> y) $ filter (\(x, _) -> x == "href") attrs === [y | (x, y) <- attr, x == "href"] === [y | ("href", y) <- attr]

Михаил
В репле можно так посмотреть: > :i Monoid type Mon...

Ну TS мой тип, я ее не определял, возможно она как то наследовалась, но не проверял... Я это имел в виду, как сделать знаю

Cheese Syrowiecki
nextAttr = [(TE.encodeUtf8 "aria-label", TE.encode...

понял, но мне в целом будет нужен гугл и яндекс, и боюсь что с русским, как минимум посковые фразы

Cheese Syrowiecki
setof = nub

согласен, а как решается, сразу мапами ? или есть сет, но он мне не попадался

Cheese Syrowiecki
foldr (\(x, y) xs -> if x == "href" then y : xs el...

спасибо, так мыслить пока не научился

Cheese Syrowiecki
universeTree + фильтруешь по тэгу "a" и атрибуту "...

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

Fedor
понял, но мне в целом будет нужен гугл и яндекс, и...

тогда я бы сразу в Text весь ответ сервера перегнал и его уже парсил

Fedor
согласен, а как решается, сразу мапами ? или есть ...

что решается? nub — это библиотечная функция, которую вы переизобрели

Fedor
спасибо, так мыслить пока не научился

ещё раз советую пройти курс Москвина, помогает видеть filter/map

Fedor
вот как по атрибуту, так чтоб не париться его соде...

попробуй сам сформулировать условие, а мы подскажем

Cheese Syrowiecki
ок, сформулируй это кодом

[x | x@(TagBranch _ attrs _), "href" in attrs]

Fedor
[x | x@(TagBranch _ attrs _), "href" in attrs]

в целом понял, спасибо

Fedor
[x | x@(TagBranch _ attrs _), "href" in attrs]

замечательно, только теперь надо эту функцию "in" расписать. ну и синтаксис не такой, но не суть

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта