2013-04-28 98 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

哇這很完美。非常感謝您的幫助和解釋! – 2013-04-28 16:43:40

3

傑克的答案是完全正確的F#但有內置函數來執行這類任務。在這個例子中,我們可以將數組發送到Array.iter,它將迭代每個項目並將項目傳遞給字符串 - >單元函數。

所以一個例子可能是這樣的:

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

a |> f Console.WriteLine;; 
+0

太好了,謝謝。要調用這個函數,我可以使用:arraryFunction(a);; ? – 2013-04-28 23:38:07

+0

@JohnOriely arrayFunction(在你的例子中)是一個參數,在這種情況下它是一個參數是一個函數。我調用'f'函數傳遞Console.WriteLine作爲示例最後一行中的arrayFunction參數。 – 2013-04-29 05:20:40

+0

@ Gary.S如果你知道輸入是一個數組,你應該使用Array.iter而不是Seq.iter。後者比較慢,因爲它使用枚舉器遍歷數組而不是循環。 – 2013-04-29 10:54:43

1

除了其他的答案 - 你並不需要顯式地指定數組參數的類型。類型推斷通常可以很好地處理它(取決於更廣泛的上下文)。所以例如這個作品:

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

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