第七章 F 庫(四)

2021-06-21 21:08:53 字數 2978 閱讀 2400

第七章 f# 庫(四)

列印(microsoft.fsharp.text.printf)模組

列印(printf)模組提供了以型別案例的方式格式化字串的函式,列印模組中函式的第乙個引數是值的佔位符,它返回的函式需要為佔位符提供值;佔位符用百分號加乙個表示型別的字母組成,表 7-2 是完整的清單。

表 7-2 列印模組的佔位符和標記

標記描述

%b布林型,格式化為 「true」 或 「false」

%s字串,格式化為它的非轉義內容

%d, %i

任何基本整型(即,sbyte, byte, int16, uint16, int32, uint32, int64, uint64, nativeint, or unativeint),格式化為十進位制整數,符號依基本整型

%u任何基本整型,格式化為無符號的十進位制整數

%x, %x, %o

任何基本整型,格式化為無符號的十六進製制數(a-f),十六進製制數(a-f),八進位制數

%e, %e

任何基本浮點數(即,float 或 float32),使用 c 風格的浮點格式規範進行格式化,有符號值的組成:[-]d.dddde[sign]ddd,其中:d 是乙個十進位制數字,dddd 是乙個或多個十進位制數字,ddd是三個十進位制數字,sign 是 + 或 -

%f任何基本浮點數,使用 c 風格的浮點格式規範進行格式化,有符號值的組成:[-]dddd.dddd,其中:dddd 是乙個或多個十進位制數字;小數點前面數字的多少取決於值的大小,後面數字的多少取決於要求的精度

%g, %g

任何基本浮點數,使用 c 風格的浮點格式規範進行格式化,有符號值以 f 或 e 格式列印,對於給定的值和精度,看哪乙個更緊湊

%msystem.decimal 值

%o任意值,列印裝箱(boxing)的物件,使用它的 tostring 方法

%a任意值,列印出的值很智慧型,使用者可以看到屬性和字段的值

%a乙個是函式,它也有兩個引數,其一是上下文引數,與給定的格式化函式(比如 system.io.textwriter)相對應的型別,其二是列印的值,可以輸出或返回適當的文字;另乙個是實際要列印的值

%t通用格式分類符,要求乙個是函式的引數:它也有兩個引數,其一是上下文引數,與給定的格式化函式(比如 system.io.textwriter)相對應的型別,其二是列印的值,可以輸出或返回適當的文字

這個標記表示用加 0 代替空格組成要求的寬度

這個標記表示在指定的寬度內左對齊

這個標記表示,如果為正數,加上 + 號(負數對應 - 號)

如果為負數額外加上空格(負數對應 - 號)

下面的示例演示如何使用 printf 函式,建立乙個函式,需要乙個字串,然後,把字串傳遞給這個函式。

printf.printf "hello %s""robert"

**的執行結果如下:

hello robert

這個示例的意義可能並不十分明顯,下面的示例有助於解釋原因。如果傳遞給printf 函式的型別錯誤,就不能編譯通過:

printf.printf "hello %s" 1

前面的**不能編譯通過,出現下面的錯誤:

prog.fs(4,25): error: fs0001: thi***pression has type

intbut is here used with type

string

這對型別推斷(type inference)也有影響。如果建立的函式使用 printf,那麼,傳遞給 printf 的任意引數都會從這裡推斷出型別。例如,下面**中函式myprintint 的型別為int -> unit,是因為其中包含了 printf 函式:

let myprintint x =

printf.printf"an integer: %i" x

列印模組中函式的基本佔位符,布林型是 %b,字串是 %s,整型為 %d 或 %i,無符號整型為 %u,而%x、%x 或 %o 則格式化為十六進製制和八進位制數[ 原文有誤];在數值型顯示中指定小數倍數也是可能的,下面的示例有演示:

let pi = system.math.pi

printf.printfn "%f" pi

printf.printfn "%1.1f" pi

printf.printfn "%2.2f" pi

printf.printfn "%2.8f" pi

**的執行結果如下:

3.141593

3.13.14

3.14159265

列印模組中還有大量其他函式,格式化字串的方法同 printf 本身,但是,結果可以寫到不同的地方。下面的示例演示了一些不同的版本:

// write to a string

let s = printf.sprintf "hello%s\r\n" "string"

printfn "%s" s

// prints the string to a .net textwriter

printf.fprintf system.console.out"hello %s\r\n" "textwriter"

// create a string that will be placed

// in an exception message

printf.failwithf "hello %s""exception"

**的執行結果如下:

hello string

hello channel [ 有誤,好像沒有這一句 ]

hello textwriter

microsoft.fsharp.failureexception: helloexception

[email protected](string s)

[email protected](a inp))

at.fsi_0003._main()

stopped due to error

第七章 F 庫(二)

第七章 f 庫 二 反射 microsoft.fsharp.reflection 模組 這個模組包含了f 自己的反射 reflection 版本。f 中的某些型別和通用語言執行時 clr 的型別系統百分之百相容,但是,它們並不能被.net反映準確理解。例如,f 使用了某種技術實現了聯合型別,這對純f...

python第七章 python教程(第七章)

字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...

第七章 函式

1.ansi c 允許函式原型的使用,函式宣告提供給編譯器和之後的呼叫函式返回值型別,引數型別和數量的資訊,而k c用單獨的列表給出引數的型別,編譯器只記住函式的返回值型別,但不儲存函式的引數數量和型別 2.沒有return語句的函式,隱式的返回 3.函式的原型可以單獨放於乙個標頭檔案中,一定要具有...