函式簽名
假設有一個函式 f,輸入一個 int 值,回傳一個 string 值,在 C# 中,該函式可以表示為:
Func<int, string>
我們可以使用箭頭(→)符號來表示:
f : int → string
箭頭符號是函式式編程社區的標準函式符號,與語言無關,
當沒有輸入或沒有輸出(void)時,用 () 表示,如果有多個輸入或輸出,則用元組表示,
例如:
Func<string>
Func<int, int, int>
分別表示為:
() → string
(int, int) → int
對于高階函式,可以嵌套表示,
例如 IEnumerable.Where 的簽名:
Func<IEnumerable<T>, Func<T, bool>, IEnumerable<T>>
// IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate);
可以表示為:
(IEnumerable<T>, (T → bool)) → IEnumerable<T>
函式的純潔性
純函式 是指沒有任何副作用的函式,除了根據輸入值計算輸出值之外,什么也不做,而不純函式則可能導致副作用,
副作用包括:
- 使全域狀態改變:這里的“全域”是指函式作用域之外,
- 改變其輸入引數
- 拋出例外
- 執行任何 I/O 操作
純函式擁有許多的好處:
- 并行化:由于輸出值僅依賴于輸入值,所以可以并行執行任務,
- 惰性求值
- 記憶化:快取函式結果,以便只計算一次,
誠實的函式
誠實的函式始終履行自己的簽名,
例如如下函式,就是一個誠實的函式:
public int Square(int n) => n * n;
而如下函式則是不誠實的:
public int Square(int n)
{
if (n < 0) throw new ArgumentException();
return n * n;
}
因為它可能回傳一個 int 值,還可能拋出例外,
參考:《C# 函式式編程》 Enrico Buonanno 著
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/26991.html
標籤:C#
上一篇:Named pipe Stream include NamedPipeServerStream and NamedPipeClientStream
下一篇:C# 可空值型別
