2009-11-22 6 views
16

최근에 나를 괴롭 히고있는 빠른 질문. Haskell은 부울 값을 반환하더라도 부울을 반환하는 함수에서 모든 동등성 테스트를 수행합니까? 하스켈의 단락 (&&)

f a b = ((a+b) == 2) && ((a*b) == 2) 

첫 번째 테스트가 false를 돌려주는 경우 예를

를 들어

, 그것은 &&에 이어 두 번째 테스트를 수행 할 것인가? 또는 하스켈은 그것을하지 않고 계속 진행할만큼 게으른가요?

답변

18

다른 언어와 마찬가지로 단락되어 있어야합니다. 이것은 서곡에서 다음과 같이 정의됩니다 :

(&&)     :: Bool -> Bool -> Bool 
True && x    = x 
False && _    = False 

따라서 첫 번째 매개 변수가 거짓이면 두 번째를 평가할 필요가 없습니다.

+0

목록 내포의 경우에도 마찬가지입니까? –

+0

'단락 회로 '가 올바르게 말하지 않습니다. 부작용없이 값을 증명할 방법이 없기 때문에 값을 평가할지 여부는 알 수 없지만 필요한 경우가 아니라면 값을 평가할 가능성은 거의 없습니다. – Dario

+0

저는 이것이 C++과 동일하다고 생각합니다. 언어에서는 오른쪽이 평가되지 않는다고 말합니다. 물론 컴파일러가 부작용이 없다고 말할 수 있다면 어쨌든 평가할 수 있습니다. 일부 C++ 컴파일러는 조건부 분기가 비싸기 때문에 그렇게합니다. –

1

게으른 평가 란 실제로 필요하기까지는 아무 것도 평가되지 않는다는 것을 의미합니다.

5

마틴 (Martin)과 마찬가지로 게으른 평가를 사용하는 언어는 가치가있는 항목을 평가하지 않습니다. 하스켈과 같은 게으른 언어에서는, 당신은 무료로 단락을합니다. 대부분의 언어에서 || & & 및 이와 유사한 연산자는 단락 회로 평가를 위해 언어에 특수하게 구축해야합니다. 그러나 하스켈에서 게으른 평가는 이것을 불필요하게 만든다.

scircuit fb sb = if fb then fb else sb

이 기능은 단지 논리적 '또는'연산자처럼 동작합니다 : 당신은 단락 심지어 자신이 함수를 정의 할 수 있습니다. 여기에 어떻게 || 하스켈에 정의되어 있습니다 :

True || _ = True 
False || x = x 

그럼, 귀하의 질문에 대한 구체적인 답변을 제공하기 위해. 왼쪽면의 || 맞다면 오른쪽이 평가되지 않는다. '단락'이라는 다른 연산자에 대해 2와 2를 함께 사용할 수 있습니다.