Programing

느낌표는 하스켈 선언에서 무엇을 의미합니까?

lottogame 2020. 4. 8. 07:36
반응형

느낌표는 하스켈 선언에서 무엇을 의미합니까?


실제 프로젝트를 사용하여 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은 순수하고 게으른 기능 언어이지만 때로는 게으름 의 오버 헤드가 너무 많거나 낭비 될 수 있습니다. 따라서이를 처리하기 위해 썽크를 구문 분석하는 대신 함수에 대한 인수를 완전히 평가하도록 컴파일러에 요청할 수 있습니다.

이 페이지에는 성능 / 엄격성에 대한 자세한 정보가 있습니다 .

참고 URL : https://stackoverflow.com/questions/993112/what-does-the-exclamation-mark-mean-in-a-haskell-declaration

반응형