의 일련의 엄격한 평가를 강제로 나는 다음과 같은 하스켈 타입 정의가 :방법 ByteString
import Data.Sequence(Seq, length)
import Data.ByteString.UTF8(ByteString)
type StringSeq = Seq ByteString
내가 deepseq
과 엄격한 평가를 강제하고자하는 유형 StringSeq
의 표현이있다. 그래서 NFData
의 인스턴스를 정의해야합니다.
import Control.DeepSeq(NFData, deepseq)
instance NFData ByteString
instance NFData a => NFData (Seq a) where
rnf s = rnf (length s)
그래서 나는 순서 자체의 평가를 강제로 순서의 길이를 계산 : 나는 다음과 같은했다. 이것은 작동하는 것 같지만 이것이 올바른 구현입니까? 더 좋은 것들이 있습니까? 시퀀스의 길이를 계산하는 데 너무 많은 오버 헤드가 발생합니까?
정의 할 수 있습니다. 확실히'NFData' 인스턴스는 유효하지 않습니다. 왜냐하면 Seq의 내용을 강요하려고 시도조차하지 않기 때문입니다. 또한'NFData'가 실제로 당신이 원하는 것일 가능성은 희박합니다. 너 정말하고 싶은게 뭐야? 'deepseq'는 보통 엄격한 동작 (및 성능)을 얻는 데 "너무 많이, 너무 늦음"입니다. – shachaf
shachaf가 말한 것 외에도 이미 NFData 인스턴스가 있습니다 : 인스턴스 NFData a => NFData (Seq a) 여기서 rnf (Seq xs) = rnf xs'. (arrh,'containers' 만 7.6.1과 함께 나온다. 이전 버전은 아님) –
하지만, Seq에 넣기 전에'ByteString'을'seq'하면된다. 'Seq'의 척추 엄격함으로 인해, 그것은 완벽한 평가를 보장합니다. –