當前位置:生活全書館 >

IT科技

> monad java

monad java

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

java monad是什麼,讓我們一起了解一下?

Monad是一個程式碼名字,意思是單子代表Windows上的一個新的互動式命令列工具以及物件導向的指令碼技術。Monad也被稱為MSH,是下一代的Windows命令shell,用全新的角度來完成各式各樣的管理任務。

Monad定義的要素有哪些?

在定義 Monad 時需要提供一個型別構造器 M 和兩個操作 unit 和 bind:

1、型別構造器的作用是從底層的型別中創建出一元型別(monadic type)。如果 M 是 Monad 的名稱,而 t 是資料型別,則 M t 是對應的一元型別。

2、unit 操作把一個普通值 t 通過型別構造器封裝在一個容器中,所產生的值的型別是 M t。unit 操作也稱為 return 操作。return 操作的名稱來源於 Haskell。不過由於 return 在很多程式語言中是保留關鍵詞,用 unit 做名稱更為合適。

java monad

3、bind 操作的型別宣告是 (M t)→(t→M u)→(M u)。該操作接受型別為 M t 的值和型別為 t → M u 的函式來對值進行轉換。在進行轉換時,bind 操作把原始值從容器中抽取出來,再應用給定的函式進行轉換。函式的返回值是一個新的容器值 M u,M u 可以作為下一次轉換的起點。多個 bind 操作可以級聯起來,形成處理流水線。

具體程式碼示例如下:

public class LoggingMonad {  private final T value; private final List logs;  public LoggingMonad(T value, List logs) { this.value = value; this.logs = logs; }  @Override public String toString() { return "LoggingMonad{" + "value=" + value + ", logs=" + logs + '}'; }  public static  LoggingMonad unit(T value) { return new LoggingMonad<>(value, List.of()); }  public static  LoggingMonad bind(LoggingMonad input, Function<T1, LoggingMonad> transform) { final LoggingMonad result = transform.apply(input.value); List logs = new ArrayList<>(input.logs); logs.addAll(result.logs); return new LoggingMonad<>(result.value, logs); }  public static  LoggingMonad pipeline(LoggingMonad monad, List<Function<T, LoggingMonad>> transforms) { LoggingMonad result = monad; for (Function<T, LoggingMonad> transform : transforms) { result = bind(result, transform); } return result; }  public static void main(String[] args) { Function<Integer, LoggingMonad> transform1 = v -> new LoggingMonad<>(v * 4, List.of(v + " * 4")); Function<Integer, LoggingMonad> transform2 = v -> new LoggingMonad<>(v / 2, List.of(v + " / 2")); final LoggingMonad result = pipeline(LoggingMonad.unit(8), List.of(transform1, transform2)); System.out.println(result); // 輸出為 LoggingMonad{value=16, logs=[8 * 4, 32 / 2]} }}

標籤: monad java
  • 文章版權屬於文章作者所有,轉載請註明 https://shqsg.com/dianzi/41m98g.html