2017-04-11 6 views
1

일부 .NET 메소드로 파이핑하는 것이 어렵다는 것을 알고 있습니다. 장난감 예F # .net 객체와의 파이핑

let foo = System.String [| 'a'; 'b'; 'c' |] // works 
let foo = [| 'a'; 'b'; 'c' |] |> System.String // fails 
// error FS0802: Invalid use of a type name and/or object constructor. 
let foo = System.String <| [| 'a'; 'b'; 'c' |] // fails the same way 
let foo = [| 'a'; 'b'; 'c' |] |> new System.String // Fails 
// error FS0010: Incomplete structured construct at or before this point in expression 

기본적으로 .NET 객체와 파이핑을 결합 할 수있는시기와 그렇지 않은 경우를 파악하려고합니다. 거기에 참조가 있다면 나는 링크를 얻고 싶습니다! 당신이 문자열을 발생하는 요령 업에 관해서는

+6

F # 4에서 예제 (예외적 인 구문을 제외하고)가 작동합니다. [생성자를 함수로 처리하는 지원이 추가되었습니다] (https://blogs.msdn.microsoft.com/fsharpteam/2014/11/) 12/f-4-0- 및 -f-tools-in-vs-2015 /)의 미리보기를 발표했습니다. 어떤 버전의 F #을 사용하고 있습니까? –

+0

나는 Microsoft (R) F를 사용하고 있습니다. 대화 형 버전 11.0.60610.1 Copyright (c) Microsoft Corporation. 판권 소유. – user1443098

+1

예, F # 4에는 대화 형 버전 14가 있으므로 F # 3 (아마도 더 오래된 버전)을 사용하고있는 것 같습니다 ... 어쨌든 적어도 Visual Studio 2015로 업그레이드하거나 링크 된 블로그 게시물에 설명 된대로'|> fun chars -> System.String chars' lambdas를 사용합니다. –

답변

2

다음 링크 기능과 같은 생성자를 치료하기위한 지원을 F에 추가 된 것을 알 수 # 4.0

https://fslang.uservoice.com/forums/245727-f-language/suggestions/5663317-allow-to-use-class-constructors-as-functions

에서 배관이 어색하게 또 다른 일반적인 상황 .NET 라이브러리는 tupled (curried과 반대) 함수 매개 변수로 노출되어있어 부분적으로 적용되는 함수가 더 고통스럽게 통과 할 수 있습니다. 이러한 clunky .NET 함수를 중심으로 카레 래퍼를 작성하는 것이 좋습니다.

+0

카레 래퍼를 만드는 좋은 예는 내 자신의 코드에서 자주 작성하는 함수이다.'let strJoin (between : string) (parts : #seq ) = System.String.Join (between, parts)'. (타입 주석은 컴파일러가'System.String.Join'을위한 유일한 오버로드를 알아낼 수 있도록 필요합니다.) 그런 다음 ListOfInts |> List.map intToHexStr |> strJoin ","|> sprintf "[% s]"와 같은 코드를 작성할 수 있으며 결과 문자열은 [0x1, 0x2, 0xdeadbeef]와 같습니다. 'System.String.Join'은 pipeable이 아니지만, 읽기 쉽고, 파이프로 연결이 쉽습니다. – rmunn