느낌표는 하스켈 선언에서 무엇을 의미합니까?
실제 프로젝트를 사용하여 Haskell을 배우려고 할 때 다음 정의를 보았습니다. 나는 각 논점 앞에서 느낌표가 무엇을 의미하는지 이해하지 못하며 나의 책은 그것을 언급하지 않은 것 같습니다.
data MidiMessage = MidiMessage !Int !MidiMessage
엄격 선언입니다. 기본적으로 이는 데이터 구조 값이 작성 될 때 소위 "약한 일반 헤드 양식"으로 평가되어야 함을 의미합니다. 이것이 무엇을 의미하는지 알 수 있도록 예제를 보자.
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
.
엄격하고 엄격하지 않은 생성자 인수의 차이점을 확인하는 간단한 방법은 정의되지 않은 경우 어떻게 동작하는지입니다. 주어진
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은 순수하고 게으른 기능 언어이지만 때로는 게으름 의 오버 헤드가 너무 많거나 낭비 될 수 있습니다. 따라서이를 처리하기 위해 썽크를 구문 분석하는 대신 함수에 대한 인수를 완전히 평가하도록 컴파일러에 요청할 수 있습니다.
이 페이지에는 성능 / 엄격성에 대한 자세한 정보가 있습니다 .
'Programing' 카테고리의 다른 글
스칼라의 방법과 기능의 차이 (0) | 2020.04.08 |
---|---|
CSS에서 @media screen과 (최대 너비 : 1024px)의 의미는 무엇입니까? (0) | 2020.04.08 |
"어설 션"기능이란 무엇입니까? (0) | 2020.04.08 |
참조 또는 값으로 shared_ptr을 전달해야합니까? (0) | 2020.04.08 |
C ++에서 객체를 함수에 전달하는 방법은 무엇입니까? (0) | 2020.04.08 |