2009-05-28 3 views
4

F #의 최신 릴리스를 자세히 살펴보면서 PLINQ와의 상호 작용을 시도했습니다. 그러나 저는이 두 가지가 코드 단위로 잘 작동하지 않는다는 것을 알아 챘습니다. 사실 그것은 다음과 같은 코드를 작성하는 것이 가능 보이지 않았다 다음 System.Linq.ParallelEnumerable 클래스에 포함 ParallelQuery의 확장 방법은 F 번호로 발탁하는 것 같지 않았어요F # 및 PLINQ 확장 방법


open System.Linq 
let someArray = [|"abc"; "def"|] 
someArray.AsParallel().Count(new Func<_,_>(fun s -> s.Length = 3)) 

때문이다.
확장 메서드에 대한 지원이 전혀 없다면 놀라지 않을 것입니다. IEnumerable에 정의 된 someArray.Count 확장 메서드에 액세스 할 수 있으므로 PLINQ에 액세스 할 수없는 이유가 궁금합니다.
내가 누락 된 것이 있습니까?
F # 제한입니까? 그렇다면, desing에 의한 것입니까? 그렇지 않은 경우 향후 릴리스에서 해결 될 예정입니까?

답변

3

아직 .NET 4.0을 사용하지 않는 경우, 당신은 같은 것을 쓸 수 있습니다 :

#r "System.Threading" 
open System.Linq 

let someArray = [|"abc"; "def"|] 

someArray.AsParallel<string>() 
|> Seq.filter (fun s -> s.Length = 3) 
|> Seq.length 

는 .NET 4.0 자, 당신은 그냥 쓸 수 있습니다 :

let someArray = [|"abc"; "def"|] 

someArray 
|> Array.Parallel.filter (fun s -> s.Length = 3) 
|> Array.length 

F 번호가의 사용을 선호 Linq 확장 메소드를 통한 Seq 모듈 그러나 FSharp.PowerPack.Linq 어셈블리에는 몇 가지 도우미 함수가 있습니다.

+0

서명은 ('T ->'U 옵션) -> 'T array ->'배열이기 때문에 당신은 저에게 해결책을주었습니다 : AsParallel에서 타입을 지정하기 때문에 그 방법을 선택할 수는 없지만. 사실 그렇지 않은 경우 비 제네릭 버전이 반환 된 것처럼 보입니다. 마지막으로, Seq, Array 및 다른 모듈이 F #에서 선호된다는 것을 알고 있습니다. 그러나 여러 상황에서 배열이 아니거나 Array.Parallel에서 제공하지 않는 것을 원할 수도 있습니다. – em70

+0

내 잘못했다. AsParallel 을 사용한 후에 확장 메서드가 선택되면 컴파일러는 적절한 과부하를 해결할 수 없으므로 쓸모가 없습니다. ( – em70

+0

Array.choose 오류에 대해 사과드립니다.나는 게시 한 직후에 그것을 발견했지만 정확한 버전으로 편집하기 전에 발견했습니다. ;) FYI-in F #, Seq 모듈은 모든 IEnumerable을 처리하며 seq 유형은 IEnumerable과 동의어입니다. –

1

정확하게 기억한다면, F #으로 멋지게 작동하도록 PLINQ를 얻는 것은 Microsoft의 개발 팀의 할일 목록에 있습니다.하지만 .NET 4.0에 나타날지 확실하지는 않습니다. F #에는 Asynchronous Workflows이 있지만 PLINQ와 매우 비슷합니다 (목록 작성법을 기반으로하는 것 외에는 일을하는 표준 기능 방식). 필자는 병렬 확장 (PLINQ/TPL)에 대한 F #에서 더 나은 지원을 언급 한 기사를 찾을 수없는 것 같아서, 나를 인용하지 마십시오. 그러나 어딘가에서 그것을 보았습니다.

MSDN 페이지 외에도 this article은 주제에 대한 좋은 소개처럼 보입니다.

PLINQ를 통한 비동기식 워크 플로우를 계속 사용하고 싶다면 this blog series (F #에서 PLINQ 사용)이 유용 할 수 있습니다.

+0

으로하지만 몇 가지 경우를 호출 할 수 있어야한다 PLINQ로. 또한 PLINQ + F #이 일정에 있음을 알리는 자료를 링크 해 주시겠습니까? 마지막으로 확장 메서드가 하나의 사례 (IEnumerable )에서 작동하고 다른 메서드가 손상되는 이유는 무엇입니까? – em70

+0

그래, PLINQ가 일부 상황에서 더 큰 범위와 기능을 제공한다는 데 동의합니다. 소식이 업데이트되었습니다. – Noldorin

1

확장 방법은 첫 번째 매개 변수로 객체를 촬영하기 정적, 그래서 당신은 그들이 확실히 꽤 유용하지 않은

내가 비동기 워크 플로에 대해 알고
ParallelEnumerable.AsParallel(someArray).Count(...)