Comments: |
Логичто что длинна строки - натуральное_число*. Значит сабжевай функция с параметром NULL должна возвращать 0 (ноль).
* всегда было интересно, относится ноль к натуральным числам или нет. Мне всегда казалось что должен относиться. По определению натуральные числа - используемые для счета предметов. Но предметы можно или считать, или нумеровать. Если мы из считаем, то у нас может быть ноль предметов. Если нумеруем, то нуля нет. Как быть, маэстро?
результат функции длина_строки() имеет тип мощность_множества и это никак не относится к проблеме неопределённых значений
Канешна если булевый тип имеет место быть. т.е. не так как в старом добром Си.
а если типов нет? они нам так уж всегда нужны?
Это bottomРазве не все на lj.rossia.org учат Хаскель ?
в порядке предпочтения
1. ошибка компиляции - тип, допускающий "неопределённое значение типа a", имеет тип не a, а Maybe a, а длина_строки ждёт тип String, и использовать надо как case a of { Just s -> _зачем нам длина_(length s) ; Nothing -> _желаемое поведение в отсутствие строки_ }
2. failed assertion
3. NULL (ЕМНИП, так в sql). Смысла мало, но хоть какая-то логика.
4. любое другое поведение
1. ошибка компиляции означала бы (что наш язык НЕ ПОДДЕРЖИВАЕТ такие значения)
2. означало бы что наша функция НЕ ПОДДЕРЖИВАЕТ такие значения.
и мне не совсем ясно как вы применяете понятие типа данных к неопределённому значению? Тип может быть известен. а может и не быть. это совсем другой вопрос.
впрочем я никак не осуждаю желание неподдерживать неопределённых значений. вопрос что с ними делать если уж мы взялись за это странное занаятие.
хорошо, пусть, что бы это не значило, мы хотим использовать вариант "нет строки" в каком-то месте. Вопрос: какой смысл имеет взятие длины пустой строки? Я сейчас не могу представить даже один конкретный пример. Даже если где-то можно вклячить код, который полагался бы на ответ "0" или "-1" или что угодно иное, это будет очевидная невменяемость кодера.
Так что "что-то делать" - это обобщать случаи, каждый из которых по отдельности есть кривость. Надо вместо этого просто ткнуть человека носом, чтобы он устыдился и быстро исправил это.
не "пустой строки", конечно, а именно пустого значения вместо строки
вы делаете очень сильные ничем не доказанные утверждения из-за ложной (неозвученой) посылки.
"все ситуации появляющиеся в runtime имеют смысл."
это ложная посылка. поэтому из отсутсвия смысла в понятии "неизвестная длина строки" не следует что нам никогда не понадобится узнать в runtime факт её неизвестности.
Тут у меня взорвался мозг. Да, любая ситуация должна иметь смысл. Если его нет, то это баг. Баги надо рано обнаруживать и репортить. 1,2 это как раз то и есть.
Ещё замечу что у нас нет "неизвестной длины строки". У нас есть длина строки, которой внезапно нет. Она, конечно, в каком-то смысле неизвестна. Но гораздо проще узнать в runtime факт отсутствия строки.
вотыменно! нам нужно узнать факт её отсутсвия в runtime.
поэтому (1) сразу нерешает нашу задачу -- это язык предназначенный для среды (которая никогда не подаст программе на вход неопределённое значение). (2) просто осложнит нам жизнь. (примерно как перл вечно ругается на невозможность вычислений с неопределёнными значениями (что вполне исправимо, но вызывает кучу ненужной програмисту рутинной работы (которая вполне алгоритмизируема и могла бы быть сделана НЕ человеком)) (3) является самым мудрым решением этой неприятной проблемы. не даром этому решению уже СТОЛЬКО лет. и не даром его придумали ТАКИЕ ГЕНИИ.
Но вот только если где в программе в рантайме исчезает смысл, то это далеко не всегда баг. Программы к сожалению не в "вакууме" работают.
1. нет, язык их подлдерживает, он просто разграничивает значения, которые могут быть не определены, и которые определены всегда 2. именно! поддержка в _языке_ - есть, то есть можно их похранить и натравить is (not) null. Поддержки в _функции_ - нет, потому что для этой функции никакого полезного смысла натравливания на NULL не существует
зачем - я написал в другом треде
нужно бросать exception ;) | |