
Алексей 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 или агду и насколько много функций тотальность которых они не могут доказать

Daniel
19.07.2018
06:22:17

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
(писал с тапка)

Daniel
19.07.2018
06:34:20

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

Daniel
19.07.2018
06:36:10

Евгений
19.07.2018
06:37:10

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

Ilya
19.07.2018
06:41:51

Daniel
19.07.2018
06:49:17

Alexander
19.07.2018
06:52:06

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

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

Ilya
19.07.2018
06:57:20

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
Я тут именно про дизайн библиотеки

Ilya
19.07.2018
06:59:21

Евгений
19.07.2018
06:59:24

Aleksey
19.07.2018
07:19:03
Библиотеки типа safe и сторонние прелюдии - вот это всё

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
второй момент, как тут сказали уже, что рекурсивные типы в хаскеле -- коиндуктивные, но иногда хочется про это забыть и считать их индуктивными (конечными).

Евгений
19.07.2018
07:22:14

Евгений
19.07.2018
07:22:52

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

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

Aleksey
19.07.2018
07:23:58

Евгений
19.07.2018
07:23:59

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

Aleksey
19.07.2018
07:24:54

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

Google

Ilya
19.07.2018
07:26:05

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

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

Ilya
19.07.2018
07:29:11

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

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

Ilya
19.07.2018
07:30:32

Евгений
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

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

Aleksey
19.07.2018
07:32:47

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

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:44:49

Ilya
19.07.2018
07:45:47

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