5.2.1 f# 和 c# 中的多值
我們在第三章討論元組時,用 c# 實現了乙個 tuple 類,與 f# 中的元組有相同的行為。使用元組不是從 c# 中的方法中返回多值的通常做法,你仍會發現,以函式方式寫**還是有用的。如果想在 c# 中寫這個,而不使用元組,或者為每乙個返回多值的方法宣告乙個新的類,你可能使用 out 引數。可以在清單 5.1 中看到這兩種方法,這裡,我們實現乙個簡單的函式程式,有餘數的除法。
listing 5.1 division with a remainder (f# and c#)
// f# version using tuples
> let divrem(a, b) = (a / b, a % b);;
val divrem : int * int -> int * int
> let (res, rem) = divrem(10, 3);;
val res : int = 3
val rem : int = 1
// c# version using out parameter
int divrem(int a, int b, out int rem)
int rem;
int res = divrem(10, 3, out rem);
f# 版本的**展示了 f# interactive 的輸出,但是,如你所見,**更短。這是因為,從一函式返回多值,在 f# 中比 c# 更加重要。c# 3.0 有另外一種方法表示多值,叫匿名型別(anonymous types)。這有些限制,因為,它只在乙個方法內容易使用,但仍很有趣。
c# 3.0 中的匿名型別
由 language integrated query (linq) 增加的關鍵功能是寫查詢的能力(我們將在第 11 章深度討論有關查詢的問題)。查詢使用集合,例如,我們可能篩選產品的集合,只選擇乙個特定種類的產品,然後,返回每種產品的名字和**。這就需要匿名型別,因為,在返回名字和**時,我們必須有效地返回多值:
var query = from p in data.products
where p.categoryid == 1
select new ;
foreach(var result in query)
console.writeline(result.name);
匿名型別與元組之間的不同在於,匿名型別的元素是命名的。名字由查詢中建立型別的**指定,能夠在以後用於讀取元素的值。我們可以重寫前面的示例,使用匿名型別:
int a = 10, b = 3;
var r = new ;
console.writeline("result=, remainder=", r.result, r.remainder);
這個不是特別有用,因為,匿名型別只能用於本地。當我們從這個方法中返回匿名型別時,丟失了編譯時的型別資訊,再也不可能很容易訪問屬性了。
我們已經看到了,在 c# 中,out 引數與 f# 中元組的使用目的相同,你可能想知道如何從 f# 中,使用現成的、有 out 引數的 .net 方法,很幸運,語言有乙個極好的功能,就專此目的而設。
使用元組代替 out 引數
如果確實想,那麼,從 f# 中也可能使用 out 引數,但是,元組通常是首選,因為,f# 自動將有 out 引數的 .net 方法暴露成返回元組的方法,因此,你不需要做任何事情,它是透明的。這就是說,你的 f# **看起來仍然像慣用的函式**,即使它呼叫的**沒有元組的概念。在 .net 中,最廣泛使用的有 out 引數的方法可能是 tryparse,它可用於所有的數值型別,比如,int32。要在 f# interactive 中使用這個方法,將首先需要開啟 system 命名空間。我們來看乙個在 c# 中使用的示例(使用out 引數):
int parsed;
bool success = int32.tryparse("41", out parsed);
and f# (using tuples)
let (success, parsed) = int32.tryparse("41");;
f# 版本寫起來相當容易,看起來更像「函式」,因為,它避免了把引數值作為引用傳遞給可變的變數。在這個示例中,我們使用模式匹配來分解返回的元組,但是,如果你想完全忽略成功的標記,也可以使用 snd 函式,從返回的元組中只挑選了數值。當解析失敗時,返回的將是這個型別的預設值,即 0。另外,我們也可以寫乙個工具函式,讓我們指定其預設值。我們將在下一章學習寫這樣的函式。
現在,在看 f# 中使用元組的最好實踐之前,暫時回到有關值與型別的討論,重溫元組型別,以及這些型別的值如何構造的。
quick cocos中c3b和c4f的區別
在做某個功能的時候,需要畫乙個綠色的矩形框,設計那邊給rgb值,在以前的公司設定顏色是直接用rgb表示,但是我看了一下quick的文件,畫乙個矩形的 建立乙個寬度 100,高度 100 的矩形,並定位於 40,40 並設定它的中間填充色 fillcolor,邊線色 bordercolor 及邊線寬度...
關於F2812中的EALLOW和EDIS指令
ti 的 dsp 為了提高安全效能,將很多關鍵暫存器作了保護處理。通過狀態暫存器 1 st1 的位6設定與復位,來決定是否允許dsp指令對關鍵暫存器進行操作。這些關鍵暫存器包括器件 暫存器 flash暫存器 csm暫存器 pie 向量表 系統控制暫存器 gpio mux 暫存器 ecan 暫存器的一...
3 3 4 2用 F 求列表中數字的和
3.3.4.2用 f 求列表中數字的和 我們已經知道了用 c 實現的 現在,再嘗試用 f 實現同樣的功能。清單 3.16 是f 函式 sumlist,並用幾個f interactive 命令進行了測試。清單 3.16對列表中元素求和 f interactive let rec sumlist lis...