Мой блог переехал в мой домен: http://blog.pirx.ru/. Теперь он статически генерируемый, так что я смогу вводить новые вещи или оформление по желанию.
В новом блоге будут материалы двух видов:
Пожалуйста, подпишитесь на новую новостную ленту!
м. Обводный канал
Author: MarcoB. Licensed under the terms of a Creative Commons License.
Монада является моноидом, если заменить декартово произведение множеств
композицией функторов (монада является функтором), умножение — функцией join,
а единицу — pure. Законы моноида при этом выполняются.
Mac Lane S. Categories for the Working Mathematician. — Springer, 1998:
A monad T = < T, η, μ > in a category X consists of a functor T: X → X and two natural transformations η: I_X → T, μ: T^2 → T, which make the following diagrams commute <…>*.
Formally, the definition of a monad is like that of a monoid M in sets <…>. The set M of elements of the monoid is replaced by the endofunctor T: X → X, while the cartesian product ⨯ of two sets is replaced by composite of two functors, the binary operation μ: M ⨯ M → M of multiplication by the transformation μ: T^2 → T and the unit (identity) element η: 1 → M by η: I_X → T. We shall thus call η the unit and μ the multiplication of the monad T; the first commutative diagram <…> is then the associative law for the monad, while the second and third diagrams express the left and right unit laws, respectively. All told, a monad in X is just a monoid in the category of endofunctors of X, with product ⨯ replaced by composition of endofunctors and unit set by the identity endofunctor.
* Диаграммы, на которые ссылается текст, описывают известные законы монад.
Свяжем это с монадами в Haskell. T — это Monad m ⇒ m a, η — это pure ::
Monad m ⇒ a → m a, а μ — join :: Monad m ⇒ m (m a) → m a.
Напомню, что эта категория называется Hask. В ней объектами являются типы
Haskell, а морфизмами — функции. Композиция морфизмов — это (.), единичный
морфизм — id.
Функторы Haskell Functor являются функторами из Hask в подкатегорию
Hask, состоящую из типов, образованных приписыванием конструктора. То есть
типу a ставится в соответствие тип m a, а функции a → b — функция m a → m
b.
Author: mwri. Licensed under the terms of a Creative Commons License.
Попробовал библиотеку @asolovyov для разбора аргументов командной строки в
Python, которая называется opster (вот доки, исходники). Это ещё
одна библиотека, решающая те же задачи, что и стандартные getopt, optparse и
argparse.
Впечатления приятные. Кода действительно надо писать меньше. Самая главная идея — отделить код обработки опций от кода функции, которой они нужны как аргументы. То есть если у меня есть функция:
def test(arg1, arg2, include=[], exclude=[], verbose=False):
'''A test command.'''
...
то для превращения её в утилиту командной строки мне не надо её менять, только
снабдить декоратором @command или обернуть её в этот декоратор непосредственно
в main:
@command(usage='%name [hIXv] arg1 arg2',
options=[
('I', 'include', [], 'include names'),
('X', 'exclude', [], 'exclude names'),
('v', 'verbose', False, 'be more verbose')])
def test(arg1, arg2, include=[], exclude=[], verbose=False):
'''A test command.'''
...
Получилось 5 строк. Этот же пример на getopt занимает где-то 30 строк.
Затем можно вызвать функцию, передав аргументы командной строки:
if __name__ == '__main__':
test(argv=sys.argv[1:])
либо вызывать как обычную функцию:
test('foo', 'bar', include=['path1', 'path2'], verbose=True)
При этом у программы появится автоматическая справка по -h:
$ ./test -h
test [hIXv] arg1 arg2
A test command.
options:
-I --include include names
-X --exclude exclude names
-v --verbose be more verbose
-h --help show help
Ещё несколько слов об особенностях. Есть поддержка подкоманд (в духе Mercurial,
Git). Нет обязательных опций, но это даже хорошо. Какой смысл в обязательных
опциях? Есть поддержка задания одной опции несколько раз (значений типа
[str]), а также значений bool, str, int и интересных значений str ->
a, то есть функций по преобразованию значения во что угодно.
Из минусов можно назвать не всегда корректную работу с Unicode, stack trace при указании неверных значений опций вместо красивых сообщений об ошибках, невозможность задать только короткое имя опции и ещё несколько мелочей.
Библиотека opster определённо заслуживает внимания.
См. также:
Жилой дом и ресторан. 1920-е. Приозерск, Ленинградская область. Функционализм.
См. также другие здания в стиле функционализм в Приозерске.
Рекомендую интересные лекции Фейнмана по квантовой механике, рассчитанные на широкий круг слушателей. В них он популярно объясняет основные понятия квантовой механики (точнее, её развития по состоянию на 1978 г.). Что интересно, он приводит много практических примеров, объясняет повседневные явления, причём делает это намного лучше, чем в сейчас в школах.
Сейчас до сих пор в школах рассказывают про оптику, волновую теорию света, про квантово-волновой дуализм, в то время как в современной физике все свойства электромагнетизма объясняются квантовой теорией. Даже такие банальные вещи, как равенство угла падения и угла отражения света.
Вот эти четыре лекции:
f x = x. I don’t do very much but at least I’m unique."James Chapman (via annayudi)
Here you can find markdown vim syntax file made by Ben Williams. Put it to the ~/vim/syntax/ folder.
To add syntax...
“This image was taken on September 15, 2006 and received on Earth September 20, 2006. The camera was pointing toward Saturn at approximately 2M...
Well, it looks like GCC 4.3.2 does not comply to C99 specification. It clearly states that:
6.8.6.4.1 ... A...