Понимание syb шаблонного устранения - PullRequest
2 голосов
/ 07 апреля 2010

В примере, приведенном в http://web.archive.org/web/20080622204226/http://www.cs.vu.nl/boilerplate/

-- Increase salary by percentage
increase :: Float -> Company -> Company
increase k = everywhere (mkT (incS k))

-- "interesting" code for increase
incS :: Float -> Salary -> Salary
incS k (S s) = S (s * (1+k))

Почему функция увеличения компилируется без привязки для первой Компании, упомянутой в сигнатуре ее типа.

Это что-то вроде присвоения частичной функции? Почему так сделано?

1 Ответ

3 голосов
/ 08 апреля 2010

Да, это та же концепция, что и частичное применение.Строка является более коротким (но, возможно, менее четким) эквивалентом

increase k c = everywhere (mkT (incS k)) c

Поскольку everywhere принимает два параметра, но только один, тип everywhere (mkT (incS k)) равен Company -> Company.Поскольку именно это increase k возвращает для каждого Float k, результирующий тип increase равен Float -> Company -> Company.

...