2013-07-04 28 views
0

是否可以將記錄或類標籤作爲參數傳遞給函數?將記錄/類標籤作爲參數傳遞

我不確定這是描述我的問題/問題的最佳方式,也許這個例子更好地說明了這一點。

這裏我硬編碼了一個函數來過濾列表,其中i.a等於v。是否有可能使i.a也可以通過?

示例代碼:

type myrecord = 
    { 
    a : int; 
    b : float 
    } 

'

let abclist = [{ a = 1; b = 2.}; { a = 11; b = 22.} 

'

let filter1 (recordList : List<myrecord>) v = 
    recordList |> List.filter (fun i -> i.a = v) 

我怎樣才能讓i.a差強人意?因此,例如,我可以調用該函數並過濾i.b而不是?

我確定它是超級簡單的(就像f#中的大多數事情一樣),但我無法打敗類型錯誤消息!

乾杯,

dusiod

回答

1

我不太知道你正在嘗試做的,但這裏有一些選擇:

filter1 (recordList |> List.map (fun t -> t.b)) v 

或改變聲明

filter1 (recordList: List<myrecord>) (v:'t) (f:myrecord -> 't) = 
    recordList |> List.filter (fun i -> (f i) = v) 

其中f類似fun t -> t.b

現有功能的簡化版本可能是

recordList |> List.filter (function |{a=A} -> A=v) 
+1

更短,保存6個字符) - > recordList |> List.filter(樂趣{A = A} - > A = V) – Gustavo

+0

喜John,感謝您的回答 - 第二個代碼示例實現了我正在嘗試做的事情。需要閱讀通用類型減速!歡呼聲,dusiod。 – dusiod