2013-04-28 2 views
1

배열에 전달한 다음 값을 인쇄 할 수있는 간단한 F # 함수를 작성하려고하는데 문제가 있습니다. 여기 내가 지금까지 가지고있는 것입니다 :배열을 함수로 전달

let a = [| a; b; c; d |];; 

let f arrayFunction (string[] array) = function 
    for b=0 to array.Length 
     Console.WriteLine(array.[]);; 

답변

5

매개 변수를 정의하는 F # 구문은 C# 구문에서 거꾸로 있습니다. F #에서는 매개 변수의 이름이 먼저오고 그 다음에 형식 (두 개를 구분하는 콜론)이옵니다.

여기에도 function 키워드가 필요하지 않습니다. 보통 let 바인딩 - function은 익명 패턴 일치 기능을 만들기위한 것입니다. 그러나 for 루프의 끝에는 do을 추가해야합니다. 마지막으로 F # for 루프에있는 to 뒤에 오는 값이 포함됩니다. 따라서 배열 길이에서 하나를 뺀 것이 아니면 결국 IndexOutOfRangeException가 발생합니다.

귀하의 기능은 다음과 같이 작성해야합니다 :

let a = [| a; b; c; d |];; 

let f arrayFunction (array : string[]) = 
    for b = 0 to array.Length - 1 do 
     Console.WriteLine (array.[b]);; 
+0

와우 그게 완벽합니다. 도와 주셔서 감사합니다. –

3

잭의 대답은 F에 # 그러나이 내장되어 기능은 작업의 이러한 종류를 할 정확하게 맞습니다. 이 예에서는 Array.iter에 배열을 보내 각 항목을 반복하고 문자열 -> unit 함수로 항목을 전달합니다.

그래서 예는 다음과 같습니다

let a = [| "a"; "b"; "c"; "d" |];; 
let f arrayFunction (array : string[]) = 
    array |> Array.iter arrayFunction;; 

a |> f Console.WriteLine;; 
+0

오, 고마워. 그리고이 함수를 호출하려면 다음을 사용할 수 있습니다. arraryFunction (a) ;; ? –

+0

@JohnOriely arrayFunction (귀하의 예제에서와 같이)는 매개 변수이며,이 경우에는 함수 인 매개 변수입니다. Console.WriteLine을 예제의 마지막 줄에있는 arrayFunction 매개 변수로 전달하는 f 함수를 호출합니다. –

+0

@ Gary.S 입력이 배열 인 경우 Seq.iter가 아닌 Array.iter를 사용해야합니다. 후자는 열거자를 사용하여 루프 대신 배열을 트래버스하기 때문에 속도가 느립니다. –

1

를 다른 답변에 추가 - 당신은 명시 적으로 배열 인수의 유형을 지정할 필요가 없었다. 타입 추론은 일반적으로 (넓은 컨텍스트에 따라) 잘 처리합니다. 예를 들면 다음과 같습니다.

let a = [| "a"; "b"; "c"; "d" |] 
let f arrayFunction array = 
    array |> Seq.iter arrayFunction 

let printme s = printfn "%s" s 
f printme a