2017-02-20 4 views
5

선택적 종료 조건을 갖는 순차 프로세스가 있습니다. 알고리즘을 작성하는 한 가지 방법이시퀀스 루프를 벗어나는 깨끗한 기능적 방법

let mutable more = true 
for slot = startSlot to endSlot do 
    if more then 
     more <- process() 

같은 이탈이 미미에 의한 스킵 슬롯 more 검사의 오버 헤드이다. 아직도 이것을 표현하는 좀 더 우아한 방법이 있어야 할 것 같습니다.

let rec loop slot = if slot <= endSlot && process() then loop (slot + 1) 
loop startSlot 

컴파일러가 감소됩니다 process() 반환 false

답변

9

재귀 여기에 평소 때

+2

+1 : 꼬리 재귀는 F #에서 그것을 수행하는 방법이며 종종 가변 변수를 피할 수 있음을 의미합니다 더 관용적 인 코드로 이어집니다. – FuleSnabel

4

것이이 일을하는 한 가지 방법은 루프를 종료합니다 Seq.takeWhile

seq{startSlot .. endSlot} 
|> Seq.takeWhile (fun _ -> process()) 
|> Seq.iter ignore 

이 사용하기 이 간단한 루프 (아니 실제 재귀가 발생).

+2

'Seq'는 게으르다; 시퀀스가 실제로 반복되지 않으면 아무 것도하지 않습니다. – ildjarn

+0

답을 편집했습니다 – klasske

+2

또한'seq'는 꼬리 재귀와 비교하여 매우 느립니다/ – FuleSnabel