3

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

型署名で言及された最初のCompanyに対して、increase関数が何もバインドせずにコンパイルされるのはなぜですか。

部分関数に割り当てるようなものですか?なぜそのように行われるのですか?

4

1 に答える 1

3

はい、部分適用と同じ考え方です。この線は、

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

Aseverywhereは 2 つのパラメーターを受け取りますが、1 つしか与えられないため、 の型はeverywhere (mkT (incS k))ですCompany -> Company。これは正確increase kに各 Float k に対して返されるものであるため、結果の型はincreaseですFloat -> Company -> Company

于 2010-04-07T20:32:08.420 に答える