了解syb样板消除

时间:2010-04-07 16:00:45

标签: generics haskell boilerplate

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 个答案:

答案 0 :(得分:3)

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

是一个更短(但可以说不太清楚)的等价物
increase k c = everywhere (mkT (incS k)) c

由于everywhere有两个参数,但只有一个参数,everywhere (mkT (incS k))的类型为Company -> Company。因为这正是increase k为每个Float k返回的结果,所以increase的结果类型为Float -> Company -> Company