2012-04-26 2 views
5

1 개 또는 2 개의 인수를 받아들이는 F # 함수를 구현하고 싶습니다. 다음과 같은 함수를 사용하고 싶습니다.F #에서 가변 인수를 구현하는 방법

let foo = ... 
foo "a" 
foo "a" "b" 

두 인수는 모두 같은 유형일 수 있습니다. 일치 패턴, 활성 패턴에 대한 페이지를 읽었지만 나를 찾을 수 없습니다.

+0

대답하는 것은 나쁜 습관입니다. 실제로는 필요하지 않지만 그것이 내 마음에옵니다. 인수가 동일한 유형의 값 목록이면 '목록'으로 만드십시오. 그 중 하나가 선택적인 경우 (예 : 생략 될 수있는 기본값을 가질 수 있음), 선택 사항 :'foo (a,? b)'. 데이터를 이와 같이 표현할 수 있다면 DU를 고려할 수도 있습니다. 그렇지 않으면 두 가지 기능 만 사용합니다. – bytebuster

답변

2

다른 답변 외에도 일부 응용 프로그램과 currying을 통해 원하는 것을 할 수 있습니다. 이와 같이 :

let foo a b = 
    a + b 

let foo2 a = 
    foo 1 a;; 

물론 foo2에서 foo를 호출 할 때 첫 번째 매개 변수를 원하는 기본값으로 수정하고 싶을 것입니다.

7

나는이 기본 닷넷의 일부 기능에 기인 생각하지만, 나는 당신이 오버로드 방법과 클래스를 사용한다고 생각 - 타입 멤버에

type t() = 
    static member foo a = "one arg" 
    static member foo (a,b) = "two args" 
+5

두 번째는 튜플이어야한다. 그렇지 않으면 첫 번째 오버로드를 호출하고 두 번째를 호출하는 것 사이에'foo "a"가 모호하기 때문이다. – Guvante

5

같은 것을, 당신은 선택 PARAMS을 사용할 수 있습니다 :

Helper.foo("a") 
Helper.foo("a", "b") 

이이 필요하시면 :

type Helper private() = 
    static member foo (input1, ?input2) = 
      let input2 = defaultArg input2 "b" 
      input1, input2 

이 메소드를 호출하려면?

불행히도 함수에 선택적 매개 변수를 사용할 수 없습니다.

3

기타 답변 외에도 몇 가지 "거의 해결책"이 있습니다. 그들은 엄격하게 당신이 원했던 것이 아니지만 어쨌든 알고있을 가치가 있습니다.

let f = function 
    | [a, b] -> ... 
    | [a] -> ... 
    | [] -> failwith "too few arguments" 
    | _ -> failwith "too many arguments" 

f ["a"] 
f ["a" ; "b"] 

문제 :

리스트 (또는 배열) 패턴 매칭을 사용하여 파라미터 걸리는 몇 파라미터 함수 서명 분명하지라는 것은 아니다. 모든 선택적 매개 변수를 전달하는 기록을 사용

:

type FParams = { a : string; b : string } 
let fdefault = { a = "a" ; b = "b" } 

let f (pars: FParams) = ... 

f { fdefault with b = "c" } 

문제 : 당신이 원하는 것을하지 않은, 또한 선택 사항입니다. 그러나 유용 할 수 있습니다.

관련 문제