Лыцарь пичальнава образа - Соцопрос [entries|archive|friends|userinfo]
silly_sad

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

Соцопрос [Sep. 23rd, 2009|09:21 am]
Previous Entry Add to Memories Tell A Friend Next Entry
если вы вызываете функцию:
длина_строки(NULL)
что от неё ждать?
понятно (если это старый добрый Си (ждать сегфолта (и то не всегда))),
а если это не Си -- если это высокоуровневый язык ЛЕГАЛЬНО поддерживающий понятие "неопределённое значение переменной")?

Вопрос:
Чего ждать от вызова:
длина_строки(неопределённое_значение)
?
LinkLeave a comment

Comments:
From:[info]mehos.livejournal.com
Date:September 23rd, 2009 - 07:57 am
(Link)
Логичто что длинна строки - натуральное_число*. Значит сабжевай функция с параметром NULL должна возвращать 0 (ноль).

* всегда было интересно, относится ноль к натуральным числам или нет. Мне всегда казалось что должен относиться. По определению натуральные числа - используемые для счета предметов. Но предметы можно или считать, или нумеровать. Если мы из считаем, то у нас может быть ноль предметов. Если нумеруем, то нуля нет. Как быть, маэстро?
From:[info]silly_sad
Date:September 23rd, 2009 - 08:02 am
(Link)
результат функции длина_строки() имеет тип мощность_множества
и это никак не относится к проблеме неопределённых значений
From:[info]stix-ok.livejournal.com
Date:September 23rd, 2009 - 02:21 pm
(Link)
false имхо.
From:[info]stix-ok.livejournal.com
Date:September 23rd, 2009 - 02:24 pm
(Link)
Канешна если булевый тип имеет место быть. т.е. не так как в старом добром Си.
From:[info]silly_sad
Date:September 24th, 2009 - 09:03 am
(Link)
а если типов нет? они нам так уж всегда нужны?
From:[info]tristes_tigres
Date:September 23rd, 2009 - 07:40 pm
(Link)
ноль или _|_
From:[info]silly_sad
Date:September 24th, 2009 - 09:04 am
(Link)
второе это чо?
From:[info]tristes_tigres
Date:September 25th, 2009 - 12:48 am
(Link)
Это bottom

Разве не все на lj.rossia.org учат Хаскель ?
From:[info]max630.livejournal.com
Date:September 23rd, 2009 - 07:51 pm
(Link)
в порядке предпочтения

1. ошибка компиляции - тип, допускающий "неопределённое значение типа a", имеет тип не a, а Maybe a, а длина_строки ждёт тип String, и использовать надо как case a of { Just s -> _зачем нам длина_(length s) ; Nothing -> _желаемое поведение в отсутствие строки_ }

2. failed assertion

3. NULL (ЕМНИП, так в sql). Смысла мало, но хоть какая-то логика.

4. любое другое поведение
From:[info]silly_sad
Date:September 24th, 2009 - 09:00 am
(Link)
1. ошибка компиляции означала бы (что наш язык НЕ ПОДДЕРЖИВАЕТ такие значения)

2. означало бы что наша функция НЕ ПОДДЕРЖИВАЕТ такие значения.

и мне не совсем ясно как вы применяете понятие типа данных к неопределённому значению? Тип может быть известен. а может и не быть. это совсем другой вопрос.
From:[info]silly_sad
Date:September 24th, 2009 - 09:02 am
(Link)
впрочем я никак не осуждаю желание неподдерживать неопределённых значений.
вопрос что с ними делать если уж мы взялись за это странное занаятие.
From:[info]max630.livejournal.com
Date:September 24th, 2009 - 09:35 am
(Link)
хорошо, пусть, что бы это не значило, мы хотим использовать вариант "нет строки" в каком-то месте.
Вопрос: какой смысл имеет взятие длины пустой строки? Я сейчас не могу представить даже один конкретный пример.
Даже если где-то можно вклячить код, который полагался бы на ответ "0" или "-1" или что угодно иное, это будет очевидная невменяемость кодера.

Так что "что-то делать" - это обобщать случаи, каждый из которых по отдельности есть кривость.
Надо вместо этого просто ткнуть человека носом, чтобы он устыдился и быстро исправил это.
From:[info]max630.livejournal.com
Date:September 24th, 2009 - 09:45 am
(Link)
не "пустой строки", конечно, а именно пустого значения вместо строки
From:[info]silly_sad
Date:September 24th, 2009 - 12:16 pm
(Link)
вы делаете очень сильные ничем не доказанные утверждения
из-за ложной (неозвученой) посылки.

"все ситуации появляющиеся в runtime имеют смысл."

это ложная посылка.
поэтому из отсутсвия смысла в понятии "неизвестная длина строки" не следует что нам никогда не понадобится узнать в runtime факт её неизвестности.
From:[info]max630.livejournal.com
Date:September 24th, 2009 - 04:01 pm
(Link)
Тут у меня взорвался мозг. Да, любая ситуация должна иметь смысл. Если его нет, то это баг. Баги надо рано обнаруживать и репортить. 1,2 это как раз то и есть.

Ещё замечу что у нас нет "неизвестной длины строки". У нас есть длина строки, которой внезапно нет. Она, конечно, в каком-то смысле неизвестна. Но гораздо проще узнать в runtime факт отсутствия строки.
From:[info]silly_sad
Date:September 24th, 2009 - 08:37 pm
(Link)
вотыменно! нам нужно узнать факт её отсутсвия в runtime.

поэтому
(1) сразу нерешает нашу задачу -- это язык предназначенный для среды (которая никогда не подаст программе на вход неопределённое значение).
(2) просто осложнит нам жизнь. (примерно как перл вечно ругается на невозможность вычислений с неопределёнными значениями (что вполне исправимо, но вызывает кучу ненужной програмисту рутинной работы (которая вполне алгоритмизируема и могла бы быть сделана НЕ человеком))
(3) является самым мудрым решением этой неприятной проблемы. не даром этому решению уже СТОЛЬКО лет. и не даром его придумали ТАКИЕ ГЕНИИ.

Но вот только если где в программе в рантайме исчезает смысл, то это далеко не всегда баг. Программы к сожалению не в "вакууме" работают.
From:[info]max630.livejournal.com
Date:September 24th, 2009 - 09:39 am
(Link)
1. нет, язык их подлдерживает, он просто разграничивает значения, которые могут быть не определены, и которые определены всегда
2. именно! поддержка в _языке_ - есть, то есть можно их похранить и натравить is (not) null. Поддержки в _функции_ - нет, потому что для этой функции никакого полезного смысла натравливания на NULL не существует

зачем - я написал в другом треде
From:[info]os80.livejournal.com
Date:September 25th, 2009 - 05:31 pm
(Link)
NULL
From:[info]stas-agarkov.livejournal.com
Date:October 4th, 2009 - 11:02 am
(Link)
нужно бросать exception ;)