но то как выглядит код мне не нравиться, а понять куда двигаться не очень могу, если кому не лень рекомендаций коментариев:
ghci> ur = Just "https://www.google.com/search?q=haskell"
ghci> res = handleResult ur
ghci> r2 = extractValue res
ghci> r3 <- extractFromIO r2
ghci> html = parseTree r3
ghci> ategs = title "a" html
ghci> ategsString = map (fmap B.unpack) ategs
ghci> fil = transformTree' filterHttpLinks ategsString
ghci> :t fil
fil :: [TagTree String]
длинна фил 22
непонятно, каково назначение программы. просто набор функций. или это вы сделали библиотеку с инструментами для себя?
скорее пытаюсь по шагам тестировать, постепенно создавая функции которые дальше использовать в программе, но мне не нравиться самому то что получается
тестировать на соответствие чему?
что именно не нравится?
Ожидаемому результату, сейчас теги уже вполне разумные, в fil
ну я же прошу сформулировать, какой результат ты ожидаешь
вид, множество конверсий, есть подозрение что где то они лишние.
String лишний, например
извини, вчера он обсуждался, - ступил - я хочу выбрать теги А из результатов поиска, сейчас результат похож на осмысленный в переменной fil в интерпретаторе
почему бы тогда не написать основную логику в файле, а не в репле?
а, да, пропустил и забыл
так я собираю кусок, результатов и пишу функцию, которая это делает, и двигаюсь выше
вот тут кусок кода в ghci — это недописанная функция?
по сути будущая функция, кторая должна вернуть нужный fil
вот и мне кажеться что я что то не так делаю или не то....
не, всё правильно
лично мне нравится в файле писать и в ghcid запускать автоматически
Не уверен, просто не понимаю, как писать сверху...
кстати упоминался учебник какой посоветуете ?, а то мне попадался душкин, но он совсем не про то как пользоваться репл и тд
extractFromIO не делает ничего, можно убрать
видеокурс Москвина и Курт
есть ещё советы на сайте https://ruhaskell.org/links
пишем функцию которая берет искомое и список ашрефов, и возращает номер или 0 например, потом пишем функцию формирующую этот список, например из дерева, и так далее вниз
а, top-down реализация? тут помогает undefined. пишешь сигнатуру, а как реализацию подставляешь undefined. пишешь тест и смотришь, где стреляет
ghci> html = parseTree r2 <interactive>:80:8: error: • No instance for (Text.StringLike.StringLike (IO B.ByteString)) arising from a use of ‘parseTree’ • In the expression: parseTree r2 In an equation for ‘html’: html = parseTree r2 это если не использовать строку r3 <- extractFromIO r2 что странно
вот про это бы где поподробнее прочитать
тут r2 — это действие, а не строка. надо сначала выполнить действие, чтобы появилась строка, которую можно парсить
используйте content <- r2
и назовите r2 понятно, например, getContent
про top-down проектирование и реализацию — книга HTDP (кстати, недавно вышел русский перевод под моей редакцией)
про top-down в Хаскеле — боюсь, нигде
понял, жаль...
стрелка влево как раз делает именно это — выполняет действие и даёт результат. и она уже есть в языке. строго говоря, это просто сахар для пользовательской функции (>>=), то есть не совсем встроено в язык, а вполне управляемо из прикладного кода
очень-очень рекомендую вместо return писать pure. смысл тот же самый (практически), но не будет лишних ошибочных ассоциаций
изучите этот вопрос и напишите статью на ruhaskell.org!
книга «Как проектировать программы» htdp.org
Статья на хабре от Юриосити была
имхо, лучший учебник программирования, причём не на каком-то языке (конкретно в этой книге используются учебные диалекты Рэкета, но это не важно), а в принципе. как декомпозировать задачу, как писать сигнатуру типа (даже в динамическом языке), документацию
Обсуждают сегодня