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 родился.
melvin
Anatolii
ну пока у тебя плагины обновляются у мнея другой вопрос:)
Кто-то NixOS пробывал?
Anatolii
ну так что бы переехать полностью и поработать с этим
melvin
понел шо за электрон
melvin
ну че поделаешь
Алдар
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]
Иван
опять веселье. такими темпами меня заставят всю библиотеку переопределить
Иван
А вы когда пишете свой код, не имеющий side effects, вы думаете о том, как ваша программа себя поведет при списках такой длинны?
Иван
Ладно, пусть по неизвестной причине рнзультат length имеет тип Int. Но почему его переполнение не выкидывает исключение? Как это делает succ maxBound :: Int
Nikita
Иван
автор в книжке "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