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
. 그리고 undefined
Turing-complete 언어에서는 피할 수 없기 때문에 비난받을 수있는 것은 seq
.
참조 URL : https://stackoverflow.com/questions/12687392/why-is-seq-bad
'UFO ET IT' 카테고리의 다른 글
this.getClass (). getClassLoader (). getResource (“…”) 및 NullPointerException (0) | 2021.01.05 |
---|---|
Jenkins에 사용자 이름과 비밀번호를 추가하려면 어떻게해야합니까? (0) | 2020.12.31 |
Int32가 int의 별칭 인 경우 Int32 클래스는 어떻게 int를 사용할 수 있습니까? (0) | 2020.12.31 |
ASP.NET Core와 관련된 ConfigureAwait (false)? (0) | 2020.12.31 |
추적 번호에 대한 정규식 패턴 (0) | 2020.12.31 |