2009-03-23 2 views
23

C#에서 함수를 얻었으므로 F #로 넘기고 싶습니다. 불행하게도, 난 그냥 F 번호에서이 표현 할 수있는 방법은없는 것 같다있는 경우에 충돌 :이 꽤 쉬울 것이라고 생각했던F #에서 변수 수를 취하는 함수 작성하기

public static T Min<T>(params T[] p) where T : IComparable 
{ 
    T m1 = p[0]; 

    foreach (T v in p) 
    { 
     m1 = (m1.CompareTo(v) < 0) ? m1 : v; 
    } 

    return m1; 
} 

이 C#을 기능을 가지고,하지만 난 방법을 이해하지 않습니다 F #에서 변수 인수 목록을 지정합니다. 나는 이것을 시도 :

let rec Min l = 
    match l with 
    | [] -> 0 // should throw exception here 
    | [v] -> v 
    | (h::t) -> min h (Min t) 

하지만 C 번호로부터의 전화는 Microsoft.FSharp.Collections.List을 기대하고있다. 그것이 가능하면 params T[]을 기대할 수 있습니까? 그렇다면 어떻게해야합니까?

+0

다음과 같이 함수를 다시 작성하는 것이 좋습니다. let min l = Seq.reduce min l – Juliet

+0

예, 그냥 본 것으로, 지금 Seq 메서드를 통과했습니다 (첫 번째 히트는 폴드되었지만 정확히 내가 뭘 찾고 있어요 – Anteru

답변

22

params 배열은 Jon 메모처럼 단순히 특성이있는 배열입니다. 매개 변수 앞에 특성을 추가하십시오.

let test ([<ParamArray>] arr : 'a array) = 
    if arr.Length = 0 then invalid_arg "arr" 
    // .... 

당신은 유형을 지정할 필요가 없습니다 :

let test ([<ParamArray>] arr) = ... // lets type inference do its thing 

하지만 ... 패턴 매칭은 배열 형식에서 작동하지 않습니다. 도움을 줄 수있는 활성 패턴을 작성할 수 있습니다. 기본적으로 F # 코드 또는 C# 코드가 무엇이 더 중요한지 결정해야합니다. C#은 대부분의 것을 표현할 수 없으며, F #은 현재 C#이 가지고있는 약간의 설탕을 지원하지 않습니다 (Expression Tree 작성법). 컴파일러 등).

+2

그러나, F #에서 매개 변수 배열은 메서드에서만 정의 할 수 있습니다. 독립 실행 형 함수 나 모듈에 정의 된 함수에서는 사용할 수 없습니다. http://msdn.microsoft.com/en-us/library/vstudio/dd233213.aspx 그래서 불행하게도 test ([] arr)가 작동하지 않습니다 –

+0

무슨 뜻입니까, 작동하지 않습니까? 개방형 시스템;; let test ([] arr) =() ;; - 잘 컴파일하는 것 같습니다. – MichaelGG

+0

모듈 테스트 = \ n t 내버려 \ 테스트 = \ n \ t \ t 테스트하자 '([] 도착) =() \ n \ t \ t 테스트'N 특성이 상 허용되지 않는 \ '하자 '바인딩의 표현 –

6

F # 또는 C#에서이 메서드를 호출 하시겠습니까? This hubFS post는 F #이 호출 측의 매개 변수 배열을 지원하지 않는다는 것을 나타내는 것으로 보이지만 매개 변수에 일반 형식 주석을 사용하여 배열로 만들고 ParamArrayAttribute으로 꾸밀면 용의자가 될 수 있습니다. C#의 변수 인수 포함.

F #의 속성을 사용하여 매개 변수를 장식하는 방법을 아직 보지 못했지만 원하는 경우 사냥을 할 수 있습니다. This blog post은 몇 가지 예제를 제공하지만 매개 변수 수준은 제공하지 않습니다.

관련 문제