Ilya
или как
Aleksei (astynax)
> ей нельзя подсунуть аргумент, который она не может заматчить
да
Aleksei (astynax)
в отличие от head, например
Aleksei (astynax)
Ilya
head2 :: [a] -> a
head2 (x:xs) = x
head2 [] = head2 []
Ilya
head2 частичная или нет?
Aleksei (astynax)
Тут рекурсия без убывания аргумента. Это просто ошибка программиста :)
Алексей
Так тотальноть не про ошибки программиста
Aleksei (astynax)
У length аргумент убывает. Если аргумент конечен, то результат всегда будет.
Алексей
Length тотальна для клнечных списков
Ilya
Ilya
или снова меняем определение, я не против
Aleksei (astynax)
Я не давал определение ещё
Aleksei (astynax)
Соответственно я его и не меняю
Aleksei (astynax)
Меня устраивает опредедение из вики
Алексей ayaye :)
Aleksei (astynax)
Считать ли некорректно написанные рукурсивный функции частичными или нет - вопрос
Алексей ayaye :)
Алексей
Что значит некорректно написанные функции?
Alexander
у нас там проблема останова решена?
Alexander
чтобы length тотальной сделать?
Aleksei (astynax)
Aleksei (astynax)
При этом в хаскеле из за ленивости вполне можно писать полезные "неправильно рекурсивные" функции :)
ones = 1 : ones
Алексей ayaye :)
f 1 = 1
f n | even n = f(n / 2)
| otherwise = f (3*n+1)
полностью определена?
Ilya
Alexander
Cheese
Окей, что мы даём на вход и ожидаем на выходе? можно считать по NF, length тотальная. по WHNF length частичная
Алексей ayaye :)
Ilya
"некорректно рекурсивная" корекурсивная что ль
Ilya
потому ones корекурсивна
Aleksei (astynax)
"нет базового случая и аргумент не убывает"
Алексей ayaye :)
полностью определена?
Алексей ayaye :)
f 1 = 1
f n | even n = f(n / 2)
| otherwise = f (3*n+1)
полностью определена?
Aleksei (astynax)
Останов не гарантируется, все значения аргумента будут обработаны
Cheese
Aleksei (astynax)
что было
Vladimir
чтобы length тотальной сделать?
Будто нерешённая проблема останова мешает определить множество частичных функций по завершаемости вычисления. Ну не будет задача определения тотальности разрешимой алгоритмом, и чо из этого?
Alexander
конечно мешает, посмотри на coq или агду и насколько много функций тотальность которых они не могут доказать
Danila Matveev
Алексей
Определить множество ничего не мешает. Оно будет невычислимым, ну и ладно
Alexander
доказательства уровня "чем-нибудь клянусь" это не круто
Aleksei (astynax)
repeat - частичная?
Aleksei (astynax)
никогда не остановится
Alexander
ну она возвращает WHNF сразу и на всех входах
Alexander
вообще с кодатой все всегда весело
Cheese
Alexander
особенно никогда она одновременно и кодата и дата
Cheese
в общем, length на WHNF (1 : ones) не даёт результат в WHNF. @astynax неправ
Cheese
можно сказать, что length — «функция с полным определением» (кстати, это называется total в Liquid Haskell)
Cheese
Alexander
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
(писал с тапка)
Danila Matveev
Alexander
удобно бы было работать?
Danila Matveev
можно носом?
а оно так и зовется, сорри, нашел
Aleksei (astynax)
оке, был неправ - в первый раз что ли :)
Aleksei (astynax)
саша
Ilya
Ilya
Но лучше конкретные функции обсуждать, чем судить в целом
Ilya
Какие-то полезны своей частичностью, какие-то нет
Евгений
Нельзя сказать, что частичность это фича. Частичность это неизбежность, если внутри языка нет пруф-асистент подмножества, явно разделяющего тотальное и нетотальное
Ilya
саша
Ну в общем моя претензия в блахе изначально была к тому, что такие функции как head, (!!), read, tail, etc выбрасывают ексепшн, вместо того, чтобы возвращать Maybe/Either
Ilya
Так-то ты прав конечно, про неизбежность
саша
Я тут именно про дизайн библиотеки
Ilya
Aleksei (astynax)
Aleksei (astynax)
Библиотеки типа safe и сторонние прелюдии - вот это всё
Ilya
в Хаскелле всегда можно говорить про тотальность только с оговорками, иначе у нас тотальными только id, const и подобные будут, из-за боттомов в каждом типе
Ilya
Отличная функция id