Главная » Haskell » Бесточечная нотация

0

В функциональном программировании очень часто функции  определяются при помощи композиции других функций без обращения внимания на то, сколько аргументов в действительности функция принимает. Например, уже приводился пример функции sum из стандартного модуля Prelude, которая определена в нём следующим образом (подробно эта функция описывается на стр. 311):

sum :: Num  a =>  [a] ->  a sum =  foldl (+) 0

Как видно, в определении нет формальных параметров, но тип функции ясно указывает, что единственным параметром функции должен быть список. Транслятор языка Haskell самостоятельно определит количество необходимых параметров функции исходя из того, сколько данных требуется в её теле  для выполнения вычислений. Поэтому на языке Haskell очень любят записывать определения функций примерно следующим образом:

f = g . h . k

вместо:

f x  = g (h  (k x))

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

Внимательный и дотошный читатель может возразить, что в бесточечной нотации используется больше точек. Речь, конечно, идёт об операции (.), которая определена в стандартном модуле Prelude и осуществляет композицию функций. Однако в наименовании техники корень «точка» не относится к этой операции. Этот термин взят из топологии, которая оперирует пространствами, состоящими из точек, а также функциями между пространствами. Так  что бесточечное определение функции — это такое определение, в котором не участвуют «точки» пространства, над которым действует функция. В терминах языка Haskell «точками» называются элементы данных, то есть формальные параметры. Другими словами, пространства в языке Haskell — это типы, а точки — их значения.

Однако с бесточечной нотацией имеется одна проблема. При неблагоразумном использовании эта методика может легко привести к эффекту «обфускации» исходного кода. При композиции цепочек функций высшего порядка бывает очень сложно мысленно вывести  тип таких композиций,  так как нет зацепок в виде аргументов, тип которых весьма помогает в процессе получения типа функции.

Также  функции, которые  определены в бесточечном стиле,  обладают свойством тяжёлой модификации в случаях, когда  необходимо внести в функциональность малейшие изменения.  Иной раз для этого приходится переписывать всю функцию. Это происходит потому, что композиция нескольких функций является  более  сложным элементом программирования, нежели вызов  функций в обычном стиле.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии