UFO ET IT

seq가 나쁜 이유는 무엇입니까?

ufoet 2020. 12. 31. 22:43
반응형

seq가 나쁜 이유는 무엇입니까?


Haskell에는 seq모든 유형의 인수를 취하여 WHNF ( Weak Head Normal Form ) 라는 이름의 마법 함수가 있습니다.

나는 "다형성 은 나쁘다" 라고 주장하는 [ 지금 그들이 누구인지 기억할 수없는 …] 몇 가지 출처를 읽었습니다 seq. 어떤면에서 "나쁜"것입니까?

마찬가지로 rnf인수를 NF ( Normal Form)로 줄이는 함수 있습니다. 그러나 이것은 클래스 메소드입니다. 임의의 유형에는 작동하지 않습니다. 언어 사양을 변경하여이를 seq. 이것은 아마도 seq. 어떤면에서 그렇습니까?

마지막으로, 누군가가주는 것을 제안 seq, rnf, par와 같은 유형 Similars 참조 id기능보다는 const그것이, 지금은 개선 될 것으로 기능을. 어떻게?


내가 아는 한 다형성 seq함수는 자유 정리를 약화 시키거나 즉,없는 유효한 일부 평등 seq은 더 이상 seq. 예를 들어, 평등

map g (f xs) = f (map g xs)

모든 함수 g :: tau -> tau', 모든 목록 xs :: [tau]및 모든 다형성 함수를 보유 합니다 f :: [a] -> [a]. 기본적으로이 같음 f은 인수 목록의 요소를 재정렬하거나 요소를 삭제하거나 복제 할 수만 있지만 새 요소를 만들 수는 없음을 나타냅니다.

솔직히 말해서 오류의 유형이 다형성이기 때문에 종료되지 않는 계산 / 런타임 오류를 목록에 "삽입"할 수있는 요소를 발명 할 수 있습니다. 즉,이 동등성은 이미 Haskell과 같은 프로그래밍 언어에서 seq. 다음 함수 정의는 방정식에 대한 반대 예제를 제공합니다. 기본적으로 왼쪽 g에서 오류를 "숨 깁니다".

g _ = True
f _ = [undefined]

방정식을 수정하려면 g엄격해야합니다. 즉, 오류를 오류에 매핑해야합니다. 이 경우 평등이 다시 유지됩니다.

다형성 seq연산자 를 추가 하면 방정식이 다시 끊어집니다. 예를 들어 다음 인스턴스화는 카운터 예제입니다.

g True = True
f (x:y:_) = [seq x y]

우리는 목록을 고려하면 xs = [False, True], 우리는이

map g (f [False, True]) = map g [True] = [True]

하지만 한편으로는

f (map g [False, True]) = f [undefined, True] = [undefined]

즉, seq목록의 특정 위치의 요소가 목록의 다른 요소의 정의에 따라 달라 지도록 할 수 있습니다 . g총합 이라면 평등이 다시 유지됩니다 . 무료 정리에 관심이 있다면 무료 정리 생성기를 확인하십시오.이 생성기 를 사용하면 오류가있는 언어 또는 seq. 이 덜 실질적인 관련성으로 보일 수도 있지만 seq, 기능 프로그램의 성취도를 개선하는 데 사용 예를 들어, 일부 변환 나누기 foldr/ build융합의 존재에 실패합니다 seq. 의 존재 하에서 자유 정리에 대한 자세한 내용을 알고 싶다면 seq 존재의 자유 정리를seq 살펴보십시오..

내가 아는 한 다형성 seq이 언어에 추가되었을 때 특정 변형을 깨뜨리는 것으로 알려져있었습니다 . 그러나 althernatives에는 단점도 있습니다. 유형 클래스 기반 seq을 추가하는 경우 seq어딘가에 깊숙이 추가하면 프로그램에 많은 유형 클래스 제약 조건을 추가해야 할 수 있습니다 . 또한을 seq사용하여 수정할 수있는 공간 누수가 있다는 사실이 이미 알려져 있었기 때문에 생략 할 수 없었습니다 seq.

마지막으로, 뭔가 놓칠 수 있지만 seq유형 연산자가 어떻게 작동 하는지 알 수 없습니다 a -> a. 단서는 seq다른 표현식이 헤드 정규형으로 평가되는 경우 표현식을 헤드 정규형으로 평가한다는 것입니다. seq유형 a -> a이있는 경우 한 표현식의 평가가 다른 표현식의 평가에 의존하도록 만드는 방법이 없습니다.


이 답변 에는 또 다른 반례가 있습니다. 모나드는 seq및으로 모나드 법칙을 충족시키지 못합니다 undefined. 그리고 undefinedTuring-complete 언어에서는 피할 수 없기 때문에 비난받을 수있는 것은 seq.

참조 URL : https://stackoverflow.com/questions/12687392/why-is-seq-bad

반응형