Библиотека определяет тип Memo a
, который является «памяткой» для функций, принимающих аргументы типа a
.Ключом к пониманию того, как использовать эту библиотеку, является понимание того, как использовать и составлять эти памятки.
В простом случае у вас есть функция с одним аргументом и простой памятник, например, функция Фибоначчи и памятникдля Integral
аргументов.В таком случае мы получаем функцию памятки, применяя памятку к функции, которую нужно запомнить:
fib = Memo.integral fib'
where
fib' 0 = 0
fib' 1 = 1
fib' x = fib (x-1) + fib (x-2)
Некоторые памятники принимают аргументы для настройки своего поведения, например arrayRange
.В следующем примере fib n
будет запоминаться только в том случае, если n
находится в диапазоне от 1 до 100.
fib = Memo.arrayRange (1, 100) fib'
where ...
В библиотеке также предусмотрены комбинаторы для создания более сложных памятников из простых.Например, list
, который превращает памятку для a
в памятку для [a]
.
Наконец, для запоминания функций нескольких аргументов существуют функции memo2
и memo3
, которыевозьмите памятку для каждого аргумента плюс функцию и верните памятную функцию.
Итак, чтобы запоминать вашу функцию с двумя аргументами, нам нужно будет использовать memo2
.Мы можем использовать памятку integral
для аргумента Int
, а для аргумента [Int]
мы можем использовать list integral
.Соединив это вместе, мы получим что-то вроде этого:
memo2 (list integral) integral foo
Однако вы также можете использовать более специфические памятники, если знаете, что числа находятся в некотором заданном диапазоне.Например, если числа в списке находятся в диапазоне от 1 до 10, а второй аргумент находится в диапазоне от 15 до 20:
memo2 (list $ arrayRange (1, 10)) (arrayRange (15, 20)) foo
Независимо от того, имеет ли это смысл или нет, зависит от вашего приложения.