2010-04-07 4 views
2

어떻게 증가 기능이 유형 서명에 언급 된 최초의 회사에 대한 아무 것도 바인딩없이 컴파일 올이해 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)) 

http://web.archive.org/web/20080622204226/http://www.cs.vu.nl/boilerplate/에 주어진.

부분적인 기능에 할당하는 것과 비슷합니까? 왜 그렇게 된거야?

답변

3

예, 부분 적용과 동일한 개념입니다. everywhere 라인은 두 개의 매개 변수를 사용하지만, everywhere (mkT (incS k))의 종류 Company -> Company 하나 주어진다

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

같이 짧은 (단 틀림 불분명) 동일하다. 이것은 정확히 increase k이 각 Float k에 대해 반환하는 값이므로 increase의 결과 유형은 Float -> Company -> Company입니다.

+4

처음에는 덜 분명할지 모르지만, 카레 기능 프로그램의 기본 속성 중 하나이며 모든 숙련 된 기능 프로그래머가 우수 사례로 간주합니다. – Martijn