2012-01-20 4 views
11

에서 여러 통화 나는이 글을 읽을 :ViewPatterns 및 하스켈

http://hackage.haskell.org/trac/ghc/wiki/ViewPatterns

내가 아이디어를 좋아하는 확장 기능을 사용하고 싶습니다. 그러나 한 가지만 확실히하려고합니다. 뷰 기능이 단일 일치에 대해 한 번 평가되는지 여부입니다.

그래서 우리가 있다고 가정 해 봅시다 :

지금의 내가 f a를 호출 가정 해 봅시다. 주어진 인자 인 a에 대해 view을 두 번 또는 한 번만 호출합니까?

편집 :

나는이 경우하는지 여부를 확인하기 위해 노력하고 다음 썼다 : GHC를 사용

{-# LANGUAGE ViewPatterns #-} 

import System.IO.Unsafe 

blah (ble -> Nothing) = 123 
blah (ble -> Just x) = x 

ble x = unsafePerformIO $ do 
    putStrLn $ "Inside ble: " ++ show x 
    return x 

main :: IO() 
main = do 
    putStrLn $ "Main: " ++ show (blah $ Just 234) 

출력 :

Inside ble: Just 234 
Inside ble: Just 234 
Main: 234 

GHC를 사용하여 출력 (와 최적화)

Inside ble: Just 234 
Main: 234 
GHCi를 사용

출력 : 번만

Main: Inside ble: Just 234 
Inside ble: Just 234 
234 
+0

GHC가있다 동일한 뷰 표현식의 재 계산을 피하기위한 특별한 해킹. – augustss

답변

13

:

효율 : 동일한보기 기능 함수 정의 또는 케이스 발현 여러 가지에인가되는 경우 (예 size을에 GHC는 이러한 응용 프로그램을 하나의 중첩 된 case 표현식으로 수집하려고 시도하므로보기 기능이 한 번만 적용됩니다. GHC의 패턴 컴파일은 The Implementation of Functional Programming Languages의 4 장에 설명 된 매트릭스 알고리즘을 따릅니다. 행렬의 첫 번째 열의 맨 위 행이 "동일한"표현식을 갖는 모든보기 패턴 인 경우이 패턴은 하나의 중첩 된 사례로 변환됩니다. 이는 예를 들어 포함

 
f ((view -> A, p1), p2) = e1 
f ((view -> B, p3), p4) = e2 

개의 뷰 패턴 표현하는 경우의 현재 개념으로하는 튜플 일렬 인접한 뷰 패턴의 "는 동일한 "매우 제한되어 심지어는 완전하지 않다 구문 평등. 그러나 변수, 리터럴, 응용 프로그램 및 튜플이 포함됩니다. 예를 들어 view ("hi", "there")의 두 인스턴스가 으로 수집됩니다. 그러나 현재 구현에서는 알파 등가성을 비교하지 않으므로 (x, view x -> y)의 두 인스턴스는 병합되지 않습니다.

- 당신의 조각에 관해서는 The GHC manual

는 문제는 최적화를 컴파일하지 않을 것입니다; ghc -Oghc -O2 모두 줄을 한 번만 인쇄합니다.즉 사용할 때 성능 관련 문제가있을 경우 확인하기 위해 항상 첫 번째 일이 GHC :

(그건 그렇고, Debug.Trace는 수동 unsafePerformIO 해킹을 작성하지 않고도 사물의 이러한 종류를 확인할 수 있습니다.)

+0

performUnsafeIO로 인해 GHC가 추가 예비 평가를 삽입 할 수 있습니까? 걱정하지 마세요. 필자는이 기능을 테스트하기 위해 사용했습니다. – julkiewicz

+0

구체적인 코드 샘플을 추가했습니다. – julkiewicz

+0

@julkiewicz : 대답을 업데이트했습니다 :) – ehird