
Index
25.08.2016
17:21:59
А по факту это надо буквально понимать -- программирование на уровне типов
Когда компилятор выполняет какие-либо функции в процессе тайпчека.
Когда система типов представляет сама собой язык программирования.
Например, редукция семей типов -- это основное средство type level программирования в Хаскеле

Google

Мерлин
25.08.2016
17:24:01

Index
25.08.2016
17:25:04
Ну да, они тьюринг полны

Denis
25.08.2016
18:31:17
Те же яйца, только в профиль.
Спросил таки у гугла, что это за зверь такой, type-level programming.
Гугл ответил, что это какая-то малопонятная плебень, которая, судя по всему, интересна только скалистам и хаскелистам.

Anatolii
25.08.2016
18:34:24
а может кто по Parsec проконсультировать?

Denis
25.08.2016
18:34:30
А в википедии есть две статьи, про functional-level и value-level programming, из которых можно вывести примерно, что же может скрываться под этим загадочным названием.

Anatolii
25.08.2016
18:35:19
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"
*Ch16 Text.ParserCombinators.Parsec> parseTDB "dasfasdsa\nxdsadsa\n"
Right ["dasfasdsa","xdsadsa"]
тоесть просто бьется по \n строчки
но если последний \n убрать
то все ломается
ну потому что вместо eol там eof вылетает

Google

Anatolii
25.08.2016
18:37:39
но я никак не могу соединить eol и eof
там бы какой-то OR

Denis
25.08.2016
18:38:43
А eof где определен?

Anatolii
25.08.2016
18:38:57
eof в Parsec есть
У eof вот такой :t
eof
:: (Show t, Text.Parsec.Prim.Stream s m t) =>
Text.Parsec.Prim.ParsecT s u m ()

Denis
25.08.2016
18:40:09
Хм сейчас запущу у себя ghci

Anatolii
25.08.2016
18:40:18
а у eol
eol
:: Text.Parsec.Prim.ParsecT
[Char] u Data.Functor.Identity.Identity String
вот такой

Denis
25.08.2016
18:40:48
Блин, тут код читать невозможно

Anatolii
25.08.2016
18:40:48
вот такие импорты нужны
import Text.ParserCombinators.Parsec
import Data.Char
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"
ну вот так скопируй
основная беда что у eof и у eol типы не сходятся
@DenisLebedev есть успехи?:)

Denis
25.08.2016
18:49:19
Atom обновляет плагины. Система занята...
Это пиздец какой-то. i3, 4 гига...

melancholiac
25.08.2016
18:50:07
че ща атом?
за*

Denis
25.08.2016
18:50:36
https://atom.io/

melancholiac
25.08.2016
18:50:45
оу

Google

melancholiac
25.08.2016
18:50:52
ну так что ты хотел
он и у меня зело тормознутый

Denis
25.08.2016
18:51:10
То, из чего Electron родился.

melancholiac
25.08.2016
18:51:53

Anatolii
25.08.2016
18:52:37
ну пока у тебя плагины обновляются у мнея другой вопрос:)
Кто-то NixOS пробывал?
ну так что бы переехать полностью и поработать с этим

melancholiac
25.08.2016
18:53:36
понел шо за электрон
ну че поделаешь

/dev
25.08.2016
19:18:13

Aldar
25.08.2016
19:30:23
type level programming это метапрограммирование на с++ шаблонах например
или разработка на языке с dependent types типа идриса, верно.7

Denis
25.08.2016
19:40:14
Любопытно.

Denis
25.08.2016
19:40:59
Похоже, с помощью комбинаторов вообще невозможно распарсить строку, которая не заканчивается одним из ожидаемых символов.
Сейчас посмотрю повнимательнее, конечно...

Anatolii
25.08.2016
19:47:26
Я уже комп выключил
Я там видел count
Может через него можно проверить длину остатка?
Завтра в гиттере спрошу
Может там кто подскажет
Конечно как вариант, когда такой файл вычитываешь откуда-то то можно проверить построений символ и поставить \n если его там нету

Google

Anatolii
25.08.2016
19:51:17
Костыль конечно
Должно быть более элегантное решение

Denis
25.08.2016
22:35:42
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"
Заебался я что-то с этим парсеком...
Но вообще задача странная, если честно.

Иван
25.08.2016
22:47:58
Всем привет. Я не так давно изучаю хаскель, только что баловался с ним и наткнулся на такое:
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
25.08.2016
22:50:03
Определи свою функцию для вычисления длины.
Только вот разумно ли работать со столь длинными списками?

Admin
ERROR: S client not available

Иван
25.08.2016
22:52:19
А как же стандартная библиотека? Code reuse? Ребята, которые над ней горбатились ведь могли это время прожить. Хочу пользоваться плодами их труда
Prelude> :t take
take :: Int -> [a] -> [a]
опять веселье. такими темпами меня заставят всю библиотеку переопределить
А вы когда пишете свой код, не имеющий side effects, вы думаете о том, как ваша программа себя поведет при списках такой длинны?
Ладно, пусть по неизвестной причине рнзультат length имеет тип Int. Но почему его переполнение не выкидывает исключение? Как это делает succ maxBound :: Int

/dev
25.08.2016
23:35:22

Иван
25.08.2016
23:39:52
автор в книжке "learn you a haskell for great good" специально обратил на это внимание
Он говорит, что хз зачем это так сделали, наверное исторически сложилось

Google

Иван
25.08.2016
23:40:59
Так что я бы поставил на то, что это ожидаемое поведение
И всем известное

corpix
26.08.2016
00:01:11
Этих "исторически известных поведений" вон целый сиплюплюс. Я думаю что такие недочеты нужно править, стремясь к консистентному поведению(потому что от этого людям станет проще и приятнее пользоваться языком).

Anatolii
26.08.2016
04:24:30
@DenisLebedev Спасибо, работает, буду разбираться как ты это сделал:)
а насчет странности, я вот такой файл хочу распарсить
http://search.cpan.org/dist/Test-Database/lib/Test/Database.pm#FILES
нидавно писал парсер на go
ну и ты же понимаешь что в конце может и не быть \n
я вот начал с малого
разбития на строчки:)

Denis
26.08.2016
04:26:05
Для этого есть функция lines. Потому и странная задача.

Anatolii
26.08.2016
04:26:45
ты вообще спишь?:)
я уже спал а ты ответил:)
я проснулся и ты тут:)
я может еще не понял как этим Parsec пользоваться
но чтобы файлик распарсить, надож е его разбить на строки саначала

Denis
26.08.2016
04:28:16
Я вчера уснуть не смог, пока не решил эту гребаную задачу!

Anatolii
26.08.2016
04:28:52
ну круто конечно

Denis
26.08.2016
04:29:49
Лучше пропиши нормальный парсер, который будет парсить сразу секциями

Anatolii
26.08.2016
04:30:24
...
да
что-то я не стой стороны пошел
я вчера просто только начал Parsec играться