2010-04-07 31 views
2

在这个例子中http://web.archive.org/web/20080622204226/http://www.cs.vu.nl/boilerplate/了解SYB样板消除

-- 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)) 

给出如何来增加功能,编译没有结合在它的类型签名提到的第一个公司什么。

是否像分配给部分函数?为什么这样做?

回答

3

是的,它与部分应用程序的概念相同。该线是

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

作为everywhere采用两个参数,而仅给定的一个,的everywhere (mkT (incS k))类型是Company -> Company较短(但可以说不太清楚)等效。因为这正是increase k为每个浮点数k返回的结果,所以increase的结果类型为Float -> Company -> Company

+4

起初可能不太清楚,但它是咖喱功能程序的基本属性之一,并被每位经验丰富的功能程序员视为良好实践。 – Martijn 2010-04-08 11:51:12