답변:
엄격 선언입니다. 기본적으로 이는 데이터 구조 값이 작성 될 때 소위 "약한 헤드 일반 양식"으로 평가되어야 함을 의미합니다. 이것이 무엇을 의미하는지 알 수 있도록 예제를 보자.
data Foo = Foo Int Int !Int !(Maybe Int)
f = Foo (2+2) (3+3) (4+4) (Just (5+5))
f
위 의 함수 는 평가 될 때 "thunk", 즉 값을 알아 내기 위해 실행할 코드를 반환합니다. 그 시점에서 Foo는 아직 존재하지 않으며 코드 만 있습니다.
그러나 어떤 시점에서 누군가 패턴 일치를 통해 내부를 보려고 할 수 있습니다.
case f of
Foo 0 _ _ _ -> "first arg is zero"
_ -> "first arge is something else"
이것은 필요한 것을 수행하기에 충분한 코드를 실행하며 더 이상은 없습니다. 따라서 4 개의 매개 변수가있는 Foo를 만듭니다 (기존이 없으면 내부를 볼 수 없기 때문에). 첫 번째는 테스트하기 4
때문에 일치하지 않는 부분 까지 평가해야합니다 .
두 번째는 테스트하지 않기 때문에 평가할 필요가 없습니다. 따라서 6
해당 메모리 위치에 저장되지 않고 나중에 평가할 수 있도록 코드 만 저장합니다 (3+3)
. 누군가가 그것을 볼 때만 6으로 바뀝니다.
그러나 세 번째 매개 변수 !
는 앞에 표시되므로 엄격하게 평가됩니다. (4+4)
실행 8
되고 해당 메모리 위치에 저장됩니다.
네 번째 매개 변수도 엄격하게 평가됩니다. 그러나 여기에 약간 까다로운 부분이 있습니다. 우리는 완전히 평가하는 것이 아니라 정상적인 머리 모양 만 약하게 평가하고 있습니다. 우리가인지 파악하는 것이이 수단 Nothing
또는 Just
뭔가, 그리고 저장,하지만 우리는 더 이상 이동하지 않습니다. 즉, 우리는 Just 10
실제로 저장하지 않고 Just (5+5)
내부에 썽크를 평가하지 않은 채로 둡니다. 비록 이것이 이것의 모든 의미가이 질문의 범위를 넘어서고 있다고 생각하지만, 이것은 알아야 할 것이 중요합니다.
BangPatterns
언어 확장 을 사용하는 경우 동일한 방식으로 함수 인수에 주석을 달 수 있습니다 .
f x !y = x*y
f (1+1) (2+2)
썽크를 반환합니다 (1+1)*4
.
seq
.
엄격하고 엄격하지 않은 생성자 인수의 차이점을 확인하는 간단한 방법은 정의되지 않은 경우 어떻게 동작하는지입니다. 주어진
data Foo = Foo Int !Int
first (Foo x _) = x
second (Foo _ y) = y
비 엄격한 인수에 의해 평가되지 않기 때문에 second
, 전달하는 것은 undefined
문제가 발생하지 않습니다
> second (Foo undefined 1)
1
그러나 undefined
우리가 값을 사용하지 않더라도 엄격한 인수는 될 수 없습니다 .
> first (Foo 1 undefined)
*** Exception: Prelude.undefined
!
내부 구현 세부 사항을 탐구하지 않고 실제로 사용자가 관찰 할 수있는 효과를 설명하기 때문 입니다.
나는 그것이 주석 주석이라고 생각합니다.
Haskell은 순수하고 게으른 기능 언어이지만 때로는 게으름 의 오버 헤드가 너무 많거나 낭비 될 수 있습니다. 따라서이를 처리하기 위해 썽크를 구문 분석하는 대신 함수에 대한 인수를 완전히 평가하도록 컴파일러에 요청할 수 있습니다.
이 페이지에 더 많은 정보가 있습니다 : 성능 / 엄격 성 .
map Just [1,2,3]
[Just 1, Just 2, Just 3] 등). 나는 완전히 관련이없는 시설뿐만 아니라 그들과 일치하는 패턴을 생각하는 것이 도움이된다는 것을 알았습니다.