Vladislav
Когда система типов представляет сама собой язык программирования.
Vladislav
Например, редукция семей типов -- это основное средство type level программирования в Хаскеле
Vladislav
Ну да, они тьюринг полны
Denis
Те же яйца, только в профиль.
Denis
Спросил таки у гугла, что это за зверь такой, type-level programming.
Denis
Гугл ответил, что это какая-то малопонятная плебень, которая, судя по всему, интересна только скалистам и хаскелистам.
Anatolii
а может кто по Parsec проконсультировать?
Denis
А в википедии есть две статьи, про functional-level и value-level programming, из которых можно вывести примерно, что же может скрываться под этим загадочным названием.
Anatolii
parseTDB = parse tdbfile "invalid file format" tdbfile = do result <- many myLine eof return result myLine = do content <- many (noneOf "\n") eol return content <?> "Line error" eol = try (string "\r\n") <|> string "\n" <|> string "\r" <?> "end of line"
Anatolii
*Ch16 Text.ParserCombinators.Parsec> parseTDB "dasfasdsa\nxdsadsa\n" Right ["dasfasdsa","xdsadsa"]
Anatolii
тоесть просто бьется по \n строчки
Anatolii
но если последний \n убрать
Anatolii
то все ломается
Anatolii
ну потому что вместо eol там eof вылетает
Anatolii
но я никак не могу соединить eol и eof
Anatolii
там бы какой-то OR
Denis
А eof где определен?
Anatolii
eof в Parsec есть
Anatolii
У eof вот такой :t eof :: (Show t, Text.Parsec.Prim.Stream s m t) => Text.Parsec.Prim.ParsecT s u m ()
Denis
Хм сейчас запущу у себя ghci
Anatolii
а у eol eol :: Text.Parsec.Prim.ParsecT [Char] u Data.Functor.Identity.Identity String
Anatolii
вот такой
Denis
Блин, тут код читать невозможно
Anatolii
вот такие импорты нужны import Text.ParserCombinators.Parsec import Data.Char
Anatolii
import Text.ParserCombinators.Parsec import Data.Char parseTDB = parse tdbfile "invalid file format" tdbfile = do result <- many myLine eof return result myLine = do content <- many (noneOf "\n") eol return content <?> "Line error" eol = try (string "\r\n") <|> string "\n" <|> string "\r" <?> "end of line"
Anatolii
ну вот так скопируй
Anatolii
основная беда что у eof и у eol типы не сходятся
Anatolii
@DenisLebedev есть успехи?:)
Denis
Atom обновляет плагины. Система занята...
Denis
Это пиздец какой-то. i3, 4 гига...
melvin
че ща атом?
melvin
за*
Denis
https://atom.io/
melvin
оу
melvin
ну так что ты хотел
melvin
он и у меня зело тормознутый
Denis
То, из чего Electron родился.
Anatolii
ну пока у тебя плагины обновляются у мнея другой вопрос:) Кто-то NixOS пробывал?
Anatolii
ну так что бы переехать полностью и поработать с этим
melvin
понел шо за электрон
melvin
ну че поделаешь
Nikita
Нервно вспомнил шаблоны в c++
/me с наслаждением пошёл перечитывать Александреску
Алдар
type level programming это метапрограммирование на с++ шаблонах например
Алдар
или разработка на языке с dependent types типа идриса, верно.7
Denis
Любопытно.
Denis
Похоже, с помощью комбинаторов вообще невозможно распарсить строку, которая не заканчивается одним из ожидаемых символов.
Denis
Сейчас посмотрю повнимательнее, конечно...
Anatolii
Я уже комп выключил
Anatolii
Я там видел count
Anatolii
Может через него можно проверить длину остатка?
Anatolii
Завтра в гиттере спрошу
Anatolii
Может там кто подскажет
Anatolii
Конечно как вариант, когда такой файл вычитываешь откуда-то то можно проверить построений символ и поставить \n если его там нету
Anatolii
Костыль конечно
Anatolii
Должно быть более элегантное решение
Denis
import Control.Monad import Data.Char import Text.ParserCombinators.Parsec parseTDB = parse tdbfile "invalid file format" tdbfile = do result <- manyTill myLine eof return result myLine = do content <- manyTill anyToken eol return content eol = try (void (string "\r\n")) <|> void (string "\n") <|> void (string "\r") <|> eof <?> "end of line"
Denis
Заебался я что-то с этим парсеком...
Denis
Но вообще задача странная, если честно.
Иван
Всем привет. Я не так давно изучаю хаскель, только что баловался с ним и наткнулся на такое: Prelude> length $ 1:(take maxBound $ repeat 1) -2147483648 Prelude> :t length length :: [a] -> Int Почему [a] -> Int, хаскель?
Иван
Почему не [a] -> Integral или [a] -> Num или [a] -> Integer
Иван
Как работать со списками длиннее, чем maxBound :: Int ?
Denis
Определи свою функцию для вычисления длины.
Denis
Только вот разумно ли работать со столь длинными списками?
Иван
А как же стандартная библиотека? Code reuse? Ребята, которые над ней горбатились ведь могли это время прожить. Хочу пользоваться плодами их труда
Иван
Prelude> :t take take :: Int -> [a] -> [a]
Иван
опять веселье. такими темпами меня заставят всю библиотеку переопределить
Иван
Только вот разумно ли работать со столь длинными списками?
А вот perl6 не говорит мне, что разумно, а что нет. Он просто делает, что я говорю.
Иван
А вы когда пишете свой код, не имеющий side effects, вы думаете о том, как ваша программа себя поведет при списках такой длинны?
Иван
Ладно, пусть по неизвестной причине рнзультат length имеет тип Int. Но почему его переполнение не выкидывает исключение? Как это делает succ maxBound :: Int
Иван
автор в книжке "learn you a haskell for great good" специально обратил на это внимание
Иван
Он говорит, что хз зачем это так сделали, наверное исторически сложилось
Иван
Так что я бы поставил на то, что это ожидаемое поведение
Иван
И всем известное
Dmitry
Этих "исторически известных поведений" вон целый сиплюплюс. Я думаю что такие недочеты нужно править, стремясь к консистентному поведению(потому что от этого людям станет проще и приятнее пользоваться языком).
Anatolii
@DenisLebedev Спасибо, работает, буду разбираться как ты это сделал:) а насчет странности, я вот такой файл хочу распарсить http://search.cpan.org/dist/Test-Database/lib/Test/Database.pm#FILES
Anatolii
нидавно писал парсер на go
Anatolii
ну и ты же понимаешь что в конце может и не быть \n