crimsonpoint

мысли вслух

вторник, октября 21, 2008

Функциональное программирование

Попалась тут переводная статья, объясняющая принципы функционального программирования на примере Питона. Всем кто занимается программированием профессионально и нет, и не в курсе что такое FP советую зачитать - Функциональное программирование на языке Python. Статья написана доступно и я думаю будет полезна даже тем кто Питон не использует, как я, например. Не согласен только с двумя вещами:
  1. Автор обидел мой любимый perl, записав его в компанию языков лишенных возможности писать в стиле FP. На самом деле в perl есть все что он описывает в статье, а в рекомендациях по хорошему стилю программирования на perl всячески рекомендуют этим пользоваться, там где уместно. Большинство так и делает - 99 процентов программеров на perl напишут:
    open(IN,"<filename") or die;
    вместо
    unless(open(IN,"<filename")) {  die; }
  2. Помоему, FP использовать нужно только там, где это делает код короче и читабельней. Злоупотреблять им явно не стоит. А то что функциональный подход стоит использовать для уменьшения количества ошибок в программе, это просто бред. Сравните примеры из статьи.
    императивный код:
    xs = (1,2,3,4)
    ys = (10,15,3,22)
    bigmuls = []
    #...прочий код...
    for x in xs:
        for y in ys:
            #...прочий код...
            if x*y > 25:
                bigmuls.append((x,y))
                #...прочий код...
    #...прочий код...
    print bigmuls

    функциональный код:
    bigmuls = lambda xs,ys: filter(lambda (x,y):x*y > 25, combine(xs,ys))
    combine = lambda xs,ys: map(None, xs*len(ys), dupelms(ys,len(xs)))
    dupelms = lambda lst,n: reduce(lambda s,t:s+t, map(lambda l,n=n: [l]*n, lst))
    print bigmuls((1,2,3,4),(10,15,3,22))

    Просто очевидно какой вариант читабельней, проще пишется и проще отлаживается.