2011-04-20 4 views
10

나는Seq.iter와 비교 - 어떤 차이가 있습니까?

for event in linq.Deltas do 

을 수행 할 수 있습니다 또는 나는

linq.Deltas |> Seq.iter(fun event -> 

그래서 나는 그 같은 경우 확실하지 않다 할 수 있습니다. 그것이 동일하지 않다면 그 차이점을 알고 싶습니다. 나는 무엇을 사용할지를 선택할 수 없다 : iter 또는 for.

추가 - 그래서 선택의 문제가있는 경우

일부 나중에 추가 내가 최고 수준에 iter를 사용하는 것을 선호하고 for이 clousures

입니다 - iter처럼 보이는 것은 map + ignore입니다 - 그것은이다 imperative ignore word를 사용하여 실행하는 방법. 그래서 그것은 기능적인 방법처럼 보이고 있습니다. ...

답변

10

for 루프의 본문에서 변경 가능한 변수를 수정할 수 있습니다. 클로저에서 그렇게 할 수는 없습니다. 이는 iter을 사용하여 수행 할 수 없음을 의미합니다. (참고 :.. 나는 for/iter의 외부에 선언 된 가변 변수에 대해서 이야기하고 지역 변경 가능한 변수에 액세스 할 수있는)

iter의 포인트가 어떤 부작용을 수행하는 점을 감안하면 그 차이는 중요 할 수있다.

나는 for이 더 명확 할 때 개인적으로 거의 iter을 사용합니다. 하지 기능 코드의 표시 - Seq.iter는 '부작용 만'긴급 구조하는 동안 빵과 함수형 프로그래밍의 버터 - F 번호에

3

대부분의 상황에서 동일합니다. 나는 첫번째 사용을 선호 할 것이다. 나에게 분명해 보인다.

차이점은 for in 루프 지원 IEnumerable 개체이고 Seq.iter는 사용자의 컬렉션 (linq.deltas)이 IEnumerable<T> 인 것을 요구합니다.

예. MatchCollection .net 정규 표현식의 클래스가 IEnumerable이 아니고 IEnumerable<T>이 아니라면 Seq.map 또는 Seq.iter을 직접 사용할 수 없습니다. 하지만 for in 루프를 사용할 수 있습니다.

+0

당신은 여전히 ​​서열과 같이 할 수있는 {을 MatchCollection에서 x의를 -> X} – manojlds

+1

또는'matchColl |> seq.cast |> Seq.iter' – ildjarn

+1

@ildjarn - 참조 http://fssnip.net/ 4f 다른 가능성. – kvb

2

프로그래밍 스타일입니다. 함수형 프로그래밍을 사용하는 것이 필수적입니다. F #은 순수 함수형 프로그래밍 언어가 아닙니다.

대용량 파이프 라인 처리의 일부인 경우 일반적으로 Seq.Iter를 사용하십시오. 훨씬 더 명확하게 처리되기 때문에 일반적으로 Iterative Way가 더 명확합니다. 때로는 개인적인 취향이며 때로는 공연과 같은 다른 문제입니다.

1

forlist comprehension의 형태이다. 여기에 당신이 for로 할 수있는 : 다른 사람이 언급

let pairsTo n = seq { 
    for i in [1..n] do 
     for j in [i..n] do 
      if j%i <> 0 then yield (i,j) } 

printf "%A" (pairsTo 10 |> Seq.toList) 
+3

F #에는'for' 두 가지가 있습니다 - 하나는 목록 내포 (여러분이 말한 것처럼) 안에 있고 다른 하나는'for '입니다. 이것은'Seq.iter'와 매우 비슷합니다. –

17

으로 약간의 차이 (iter는 제네릭이 아닌 IEnumerator을 지원하고 formutable 값을 돌연변이 수)이 있습니다.이들은 때로는 중요한 차이점이 있지만 대부분의 시간에 어느 것을 자유롭게 사용할 것인지 선택할 수 있습니다.

나는 일반적으로 for을 선호합니다 (언어 구성이있는 경우 사용하지 않는 이유는 무엇입니까?). iter이 좋네요 보이는 경우 당신이 호출해야하는 함수가있을 때 (예를 들어, 일부 응용 프로그램을 사용하여)입니다 마찬가지로

// I would write this: 
strings |> Seq.iter (printfn "%c") 

// instead of: 
for s in strings do printfn "%c" s 

, iter이 좋네요하여 일부 처리 파이프 라인의 끝 부분을 사용하는 경우 :

// I would write this: 
inputs |> Seq.filter (fun x -> x > 0) 
     |> Seq.iter (fun x -> foo x) 

// instead of: 
let filtered = inputs |> Seq.filter (fun x -> x > 0) 
for x in filtered do foo x 
관련 문제