2013-03-01 3 views
0

나는 다음과 같은하스켈 : 같은 줄에서 여러 번 함수를 호출

같은 기능이있는 경우
f x = if g x /= Nothing then g x else False 

f에 두 번 호출 또는 하스켈 '캐시'첫 번째 인스턴스 후 g x의 결과를 수행 할 수 g합니다 나중에 같은 줄에서 사용할 수 있습니까? 나는 몇몇 코드를 최적화하려고 노력하고 있으며, 위의 스타일의 함수가 계산 상으로 비싸기를 두 번 원하는지 모르겠다.

미리 감사드립니다.

+0

또한 동일한 행에 일이 발생하는지 여부는 관계가 없습니다. 그것은 구문에 영향을 미치는데, 즉 블록이 시작하고 끝나는 곳 ('{}'을 사용하여 항상 명시 적으로 작성할 수 있음)은 영향을 미치지 않습니다. – luqui

답변

14

하스켈 구현은 함수 호출을 메모하지 않습니다.

하스켈 컴파일러 (예 : GHC)는 do common subexpression eliminiation이지만 제한 사항이 있습니다.

의심스러운 경우 결과를 공유하십시오.

f x = if g' /= Nothing then g' else False 
    where g' = g x 

g '는 부울과 어쩌면 둘 다 사용할 수 없으므로 유형 오류가 있습니다.

f x = case g x of 
      Nothing -> .. 
      Just _ -> .. 

가 계산하고 하나 개의 지점에서 결과를 공유 :

그러나 더 나은

는 다음과 같이 작성.

+0

고맙습니다. 그것은 완벽하게 설명합니다. 그리고 예, 저는 예제 함수를 작성하는 데 조급했습니다. – Robincognito

+1

'g'는 부울과 '미정'이 될 수 없다는 것을 어떻게 알 수 있습니까? 예를 들어,'g'는'read'가 될 수 있고 원래의 함수는 typecheck 할 것입니다 ... – kosmikus

+4

좋아요, 그것은 오버로드 된'g'의 인스턴스가 될 수 있습니다. :) 그러나'\ f g x -> g x/= Nothing then g x else False'는 날아 가지 않습니다. –

관련 문제