пятница, 24 июня 2011 г.

[prog] Чем может отличаться sequence от sequence_?

В программировании есть (как минимум) две фундаментальные и неразрешимые проблемы – предсказание сроков разработки и выбор имен для классов/функций/переменных. С первой проблемой хоть как-то пытаются бороться. А вот вторую, складывается впечатление, только стараются усугубить.

Помнится, несколько лет назад на RSDN я защищал короткие имена методов, принятые в стандартной библиотеки Ruby – вроде to_i (а не ToInteger), to_a (а не ToArray) и пр. Поскольку у меня большой C/C++ опыт, то ничего страшного в to_i по сравнению с strcpy не видел и не вижу. Тем не менее, сейчас я сам оказался в ситуации своего тогдашнего оппонента. Но смолчать не смогу :)

Читаю статью Beautiful Concurrency Саймона Пейтона Джонса. Дохожу до примера в разделе 4.3 на стр.17:

sequence_ [ elf elf_group n | n <- [1..10] ]

Конструкция в квадратных скобках – это list comprehension, т.е. формирование списка элементов вида [elf elf_group 0, elf elf_group 1, ...,elf elf_group 10].

Намного интереснее функция sequence_. Делает она простую вещь – перебирает последовательно элементы переданного ей списка. И возвращает, грубо говоря, void. Т.е. имеет прототип:

sequence_ [IO a] :: IO ()

В принципе, ее цель понятна. Но почему название такое, с подчеркиванием на конце? А потому, что уже есть sequence без подчеркивания с прототипом:

sequence [IO a] :: IO [a]

которая берет один список и возвращает второй список. А не void.

Вот такие вот две функции в стандартной библиотеке. С сильно разным возвращаемым значением, но отличающиеся всего лишь наличием подчеркивания в имени!

Все-таки остаюсь при мнении, что хардкорные функциональщики не от мира сего. Слишком сильна в них любовь к математике, чрезмерной компактности, однобуквенным обозначениям с разным количеством дополнительных закорючек.

Отправить комментарий