Нет строгого определения комбинатора, поэтому это не означает ничего в этом смысле. Однако в Haskell очень часто создавать более сложные функции или значения из более простых, а иногда функции не подходят друг другу полностью, поэтому мы используем некоторый клей, чтобы они склеивались. Биты клея, которые мы используем, мы называем комбинаторами.
Например, если вы хотите, чтобы вычислить квадратный корень из числа, округленное до ближайшего целого числа, вы можете написать эту функцию как
approxSqrt x = round (sqrt x)
Вы также можете реализовать то, что мы действительно делаем здесь принимает две функции и построение более сложной функции, использующей их в качестве строительных блоков. Нам нужно какое-то клей положить их вместе, однако, и что клей (.)
:
approxSqrt = round . sqrt
Таким образом, оператор композиции функций является комбинатором функций - он сочетает в себе функцию для создания новых функций. Другой пример: возможно, вы хотите прочитать каждую строку файла в списке. Вы можете сделать это очевидным образом:
do
contents <- readFile "my_file.txt"
let messages = lines contents
...
Но! Что бы мы сделали, если бы у нас была функция, которая читает файл и возвращает содержимое в виде строк? Тогда мы могли бы сделать
do
messages <- readFileLines "my_file.txt"
...
Как выясняется, у нас есть функция, которая считывает файл и у нас есть функция, которая принимает большую строку и возвращает список строк в нем. Если бы у нас был только какой-то клей, чтобы связать эти две функции значимым образом, мы могли бы построить readFileLines
! Но, конечно, это Haskell, этот клей легко доступен.
readFileLines = fmap lines . readFile
Здесь мы используем два комбинатора! Мы используем (.)
от ранее, и fmap
на самом деле очень полезный комбинатор.Мы говорим, что это «лифты» чистое вычисление в монаде IO, и то, что мы на самом деле означает, что lines
имеет тип подписи
lines :: String -> [String]
но fmap lines
имеет подпись
fmap lines :: IO String -> IO [String]
так fmap
полезно когда вы хотите комбинировать чистые вычисления с вычислениями ввода-вывода.
Это только два простых примера. По мере того, как вы узнаете больше Haskell, вам будет нужно (и изобретать) все больше и больше функций комбинатора для себя. Haskell очень эффективен в том, как вы можете выполнять функции и преобразовывать их, комбинировать их, выворачивать их наизнанку, а затем склеивать их. Биты клея, которые нам иногда нужны, когда мы это делаем, те биты, которые мы называем комбинаторами.
Есть некоторые технические значения слова «combinator», но по большей части люди Haskell полностью игнорируют их. В разговорной речи это обычно означает «ценность» или «штучка». – shachaf
У Haskell wiki есть страница под названием Combinator с двумя определениями для вас: http://www.haskell.org/haskellwiki/Combinator –