@haskellru

Страница 1350 из 1551
Алексей Ayaye :)
19.07.2018
06:19:00
f 1 = 1 f n | even n = f(n / 2) | otherwise = f (3*n+1) полностью определена?

Aleksey
19.07.2018
06:19:31
Останов не гарантируется, все значения аргумента будут обработаны

Yuriy
19.07.2018
06:20:09
Aleksey
19.07.2018
06:20:34
что было

Google
Vladimir
19.07.2018
06:20:47
чтобы length тотальной сделать?
Будто нерешённая проблема останова мешает определить множество частичных функций по завершаемости вычисления. Ну не будет задача определения тотальности разрешимой алгоритмом, и чо из этого?

Alexander
19.07.2018
06:21:48
конечно мешает, посмотри на coq или агду и насколько много функций тотальность которых они не могут доказать

Pineapple
19.07.2018
06:22:46
Определить множество ничего не мешает. Оно будет невычислимым, ну и ладно

Alexander
19.07.2018
06:23:07
доказательства уровня "чем-нибудь клянусь" это не круто

Aleksey
19.07.2018
06:23:29
repeat - частичная?

никогда не остановится

Alexander
19.07.2018
06:23:54
ну она возвращает WHNF сразу и на всех входах

вообще с кодатой все всегда весело

Yuriy
19.07.2018
06:25:41
не распарсил текст %) но про останов писали уже, это необходимое условие для тотальности
да, но вычисление останавливаемости мешает вычислять тотальность

Alexander
19.07.2018
06:25:54
особенно никогда она одновременно и кодата и дата

Daniel
19.07.2018
06:27:32
да, но вычисление останавливаемости мешает вычислять тотальность
это уже что-то про (автоматическое?) доказательство вопрос все же был что есть тотальная и частичная

Yuriy
19.07.2018
06:30:41
в общем, length на WHNF (1 : ones) не даёт результат в WHNF. @astynax неправ

Google
Daniel
19.07.2018
06:32:09
это уже что-то про (автоматическое?) доказательство вопрос все же был что есть тотальная и частичная
и надо все же разделять классическую мат функцию и то что в яп (какой-нить более специфичной математики), потому что в первом случае нет понятия о длительности вычисления, результат либо существует, либо нет

Yuriy
19.07.2018
06:32:49
можно сказать, что length — «функция с полным определением» (кстати, это называется total в Liquid Haskell)

Alexander
19.07.2018
06:34:05
totalLength c !p [] = Right (p+c) totalLength c p (_:xs) | p < chunkSize = totalLength c (p+1) xs | otherwise = Left $ \() -> totalLength (c+p) 0 xs

(писал с тапка)

Alexander
19.07.2018
06:34:22
удобно бы было работать?

Daniel
19.07.2018
06:36:10
можно носом?
а оно так и зовется, сорри, нашел

Евгений
19.07.2018
06:37:10
length определена на всех значениях аргумента
Ты под значениями только конструкторы понимаешь? Такое. Всё-таки значения -- это набор термов, удовлетворяющих данному типу

Aleksey
19.07.2018
06:38:35
оке, был неправ - в первый раз что ли :)

Ilya
19.07.2018
06:41:51
Вопрос: а обилие частично определённых функций в стандартной библиотеке хаскеля это баг или фича?
а теперь можно и на исходный вопрос ответить "обилие частично определённых функций в стандартной библиотеке хаскеля" — это, несомненно, фича

Daniel
19.07.2018
06:49:17
тезис Чёрча—Тьюринга говорит, что не надо разделять
этот тезис как раз подразумевает существование понятия вычислимость (если верить вики), чего нет в определении функции математической

Ilya
19.07.2018
06:54:07
Но лучше конкретные функции обсуждать, чем судить в целом

Какие-то полезны своей частичностью, какие-то нет

Евгений
19.07.2018
06:56:03
Нельзя сказать, что частичность это фича. Частичность это неизбежность, если внутри языка нет пруф-асистент подмножества, явно разделяющего тотальное и нетотальное

Alexander
19.07.2018
06:58:01
Ну в общем моя претензия в блахе изначально была к тому, что такие функции как head, (!!), read, tail, etc выбрасывают ексепшн, вместо того, чтобы возвращать Maybe/Either

Google
Ilya
19.07.2018
06:58:11
Так-то ты прав конечно, про неизбежность

Alexander
19.07.2018
06:58:48
Я тут именно про дизайн библиотеки

Евгений
19.07.2018
06:59:24
Явно разделяющего точно тотальное и возможно нетотальное
Не очень корректно написал. Конечно возможно нетотальное

Ilya
19.07.2018
07:20:45
в Хаскелле всегда можно говорить про тотальность только с оговорками, иначе у нас тотальными только id, const и подобные будут, из-за боттомов в каждом типе

Ilya
19.07.2018
07:21:20
Отличная функция id

Евгений
19.07.2018
07:21:35
Практически у всех этих функций есть стандартные safe аналоги, либо их можно одним case'ом заменить

Alexander
19.07.2018
07:22:11
этим всем можно не пользоваться :)
Да оно понятно, что стандартной библиотекой с самыми что ни на есть стандартными функциями можно не пользоваться, а взять вместо этого что-то стороннее. Но меня беспокоит то, что оно unsafe by default

Ilya
19.07.2018
07:22:12
второй момент, как тут сказали уже, что рекурсивные типы в хаскеле -- коиндуктивные, но иногда хочется про это забыть и считать их индуктивными (конечными).

Ilya
19.07.2018
07:22:54
Название safe вводит в заблуждение, как будто с помощью этих headMaybe можно писать безопасные программы, пф

Ilya
19.07.2018
07:23:12
length тотальная, если забыть про боттомы и бесконечные списки

Alexander
19.07.2018
07:24:41
Исторически сложилось
ну вот да, я когда это увидел тоже подумал, что это связано в первую очередь с возрастом

Aleksey
19.07.2018
07:24:54
Название safe вводит в заблуждение, как будто с помощью этих headMaybe можно писать безопасные программы, пф
те части, которые построены сугубо из содержимого safe, вполне себе безопасны - насколько это возможно :)

Alexander
19.07.2018
07:25:32
А то я вообще как-бы из раста, а там паники ловить нельзя, поэтому всё стараются делать сейф. После этого Haskell немного конфьюзит

Google
Ilya
19.07.2018
07:26:09
для бесконечных списков имеет смысл говорить о продуктивности. length не продуктивна, из-за того, что возвращаемый тип Int не коиндуктивен, можно написать продуктивный length', возвращающуй Nat, например

Ilya
19.07.2018
07:26:17
Aleksey
19.07.2018
07:26:17
Так в хаскеле тоже в основном стараются всё делать safe :)

Ilya
19.07.2018
07:27:01
Хотя ладно, fromJust то не сейф тоже

Alexander
19.07.2018
07:27:21
Не делают fromJust и так далее
ну в русте вон тоже unwrap есть, но ничего, живём как-то

Ilya
19.07.2018
07:27:42
А матчить руками (\(Just x) -> ..) мы не будем ок

Тогда норм

Aleksey
19.07.2018
07:28:27
Code review для такого есть :)

Admin
ERROR: S client not available

Alexander
19.07.2018
07:28:28
А матчить руками (\(Just x) -> ..) мы не будем ок
можно компилятор попросить громко ругаться на non exhaustive patterns

Ilya
19.07.2018
07:29:11
можно компилятор попросить громко ругаться на non exhaustive patterns
Ну попроси :) Он же лямбды не смотрит, по-моему

Aleksey
19.07.2018
07:29:13
так и делаем - -Werror на CI

Ilya
19.07.2018
07:29:15
Это вам не идрис

Aleksey
19.07.2018
07:29:26
Смотрит вроде

Ilya
19.07.2018
07:29:27
id от нетотального аргумента будет нетотальна :)
ну, id undefined не взорвется же, но если хочется убить боттом, давайте оставим только const

Евгений
19.07.2018
07:30:19
Ага, только боттомы друг другу не равны. id $ head [] взорвётся

Ilya
19.07.2018
07:30:32
можно компилятор попросить громко ругаться на non exhaustive patterns
Компилятор не всегда может проверить, рассмотрены ли все случаи в гардах

Евгений
19.07.2018
07:31:10
Если хочется убить боттом, то нужно пруф-асистентент в язык встраивать #ленивый_идрис

Ilya
19.07.2018
07:31:24
Google
Ilya
19.07.2018
07:31:34
так же как и id undefined

Alexander
19.07.2018
07:31:36
Компилятор не всегда может проверить, рассмотрены ли все случаи в гардах
можно попросить ругаться на все гарды без otherwise или что-то типа того

Ilya
19.07.2018
07:32:33
иногда удобно писать гарды без otherwise

Ilya
19.07.2018
07:32:57
хотя в таком случае обычно есть catchall clause

Aleksey
19.07.2018
07:33:36
проверка на pattern match exhaustiveness - штука сложная

view patterns всякие оную ломают

Alexander
19.07.2018
07:36:37
f x | x > 0 = "foo" f 0 = "bar" f _ = "qux"
ну как по мне лучше где-то явно написать аналог рустовского unreachable!(), чем писать сложные матчи, которые компилятор не может определить как exhaustive

Ilya
19.07.2018
07:38:15
идрис вот отловит такое, да

ну и наверное всякие расширения хаскеля

Dmitry
19.07.2018
07:43:00
А подскажите, есть ли готовые библиотеки для расширяемых массивов, типа std::deck из C++ (состоит из списка массивов). Так, чтобы можно было с одного из концов добавлять, но не переаллоцировать каждый раз, ну и чтобы оверхеда, как в стандартных одноэлементных списках, не было?

И самому можно написать, но зачем, если готовое есть

Alexander
19.07.2018
07:44:24
Dmitry
19.07.2018
07:46:09
Они на списках

А мне нужно поплотнее элементы располагать

Aleksey
19.07.2018
07:47:03
-Wall, увы, далеко не all

Ilya
19.07.2018
07:47:42
Data.Sequence на finger tree

Ilya
19.07.2018
07:47:52
-Wall, увы, далеко не all
какой ключик нужен ещё?

Страница 1350 из 1551