1 개 또는 2 개의 인수를 받아들이는 F # 함수를 구현하고 싶습니다. 다음과 같은 함수를 사용하고 싶습니다.F #에서 가변 인수를 구현하는 방법
let foo = ...
foo "a"
foo "a" "b"
두 인수는 모두 같은 유형일 수 있습니다. 일치 패턴, 활성 패턴에 대한 페이지를 읽었지만 나를 찾을 수 없습니다.
1 개 또는 2 개의 인수를 받아들이는 F # 함수를 구현하고 싶습니다. 다음과 같은 함수를 사용하고 싶습니다.F #에서 가변 인수를 구현하는 방법
let foo = ...
foo "a"
foo "a" "b"
두 인수는 모두 같은 유형일 수 있습니다. 일치 패턴, 활성 패턴에 대한 페이지를 읽었지만 나를 찾을 수 없습니다.
다른 답변 외에도 일부 응용 프로그램과 currying을 통해 원하는 것을 할 수 있습니다. 이와 같이 :
let foo a b =
a + b
let foo2 a =
foo 1 a;;
물론 foo2에서 foo를 호출 할 때 첫 번째 매개 변수를 원하는 기본값으로 수정하고 싶을 것입니다.
나는이 기본 닷넷의 일부 기능에 기인 생각하지만, 나는 당신이 오버로드 방법과 클래스를 사용한다고 생각 - 타입 멤버에
type t() =
static member foo a = "one arg"
static member foo (a,b) = "two args"
두 번째는 튜플이어야한다. 그렇지 않으면 첫 번째 오버로드를 호출하고 두 번째를 호출하는 것 사이에'foo "a"가 모호하기 때문이다. – Guvante
같은 것을, 당신은 선택 PARAMS을 사용할 수 있습니다 :
Helper.foo("a")
Helper.foo("a", "b")
이이 필요하시면 :
type Helper private() =
static member foo (input1, ?input2) =
let input2 = defaultArg input2 "b"
input1, input2
이 메소드를 호출하려면?
불행히도 함수에 선택적 매개 변수를 사용할 수 없습니다.
기타 답변 외에도 몇 가지 "거의 해결책"이 있습니다. 그들은 엄격하게 당신이 원했던 것이 아니지만 어쨌든 알고있을 가치가 있습니다.
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" }
문제 : 당신이 원하는 것을하지 않은, 또한 선택 사항입니다. 그러나 유용 할 수 있습니다.
대답하는 것은 나쁜 습관입니다. 실제로는 필요하지 않지만 그것이 내 마음에옵니다. 인수가 동일한 유형의 값 목록이면 '목록'으로 만드십시오. 그 중 하나가 선택적인 경우 (예 : 생략 될 수있는 기본값을 가질 수 있음), 선택 사항 :'foo (a,? b)'. 데이터를 이와 같이 표현할 수 있다면 DU를 고려할 수도 있습니다. 그렇지 않으면 두 가지 기능 만 사용합니다. – bytebuster