밀리 초 시간대의 기록 틱 데이터 시퀀스를 처리해야합니다. 능력은 특정 시간대 (시간, 분 등)의 오프닝 틱을 걸러 내야합니다. 연속열은 스팬보다 큰 간격을 가질 수 있으므로 이러한 간격 이후의 첫 번째 틱은 첫 번째 틈으로 선택해야합니다. 그렇지 않으면 시작 틱은 해당 타임 라인의 달력 시작 부분에 가장 가까운 틱입니다.상태 정보를 전달하는 다른 관용적 방법이 있습니까?
let opensTimespan (interval: Timespan)=
let lastTakenId = ref -1L // Timestamps are positive
fun (tickAt: Timestamp) ->
let tickId = tickAt/interval in
if tickId <> !lastTakenId then lastTakenId := tickId; true
else false
를 실행 한 다음, 내 마음에 오는
우선 호출 사이 전달하는 폐쇄로 틱 각각의 갭을 열거 나 간격 개방의 timespanId을 캡처 다음 상태 필터링 기능 opensTimespan:Timespan->(Timestamp->bool)
입니다 다음과 같이 적용 할 수 있습니다
let hourlyTicks = readTicks @"EURUSD-history.zip" "EURUSD-2012-04.csv"
|> Seq.filter (opensTimespan HOUR) |> Seq.toList
이 잘 작동하지만 opensTimespan
측면 효과를 갖는 것은 확실히 관용적 없습니다.
하나의 대안은 다음과 무 필터링 기능 opensTimespanF:Timespan->Timestamp*Timestamp->bool
을 마련하기 위해 진드기에 따라 결정이 하나를 열거 나되지 않는다는 사실 자체와 이전의 타임 스탬프의 단지 한 쌍을 필요로를 사용하고있을 수 있습니다 :
let opensTimespanF interval (ticksPair: Timestamp*Timestamp) =
fst ticksPair/ interval <> snd ticksPair/ interval
: 기능 순수되는
let hourlyTicks=
seq {
yield 0L;
yield! readTicks @"EURUSD-history.zip" "EURUSD-2012-04.csv"
}
|> Seq.pairwise |> Seq.filter (opensTimespanF HOUR)
|> Seq.map snd
|> Seq.toList
이 방법은 단지 약간의 (~ 11 %) 성능 저하와 동등한 결과를 얻을 수 있습니다.
순수한 기능적 방식으로이 작업에 접근하는 다른 방법에는 어떤 것이 있습니까?
감사합니다.
나는 부작용이 opensTimespan 함수 내 국한되어있는 경우, 그것은 '관용적'하지 않을 수 있음을 말하고 싶지만, 그러나 성능을 확실하게 허용 . 핵심 F # 함수는 동일합니다. – Benjol