java monad是什么,讓我們一起了解一下?
Monad是一個(gè)代碼名字,意思是單子代表Windows上的一個(gè)新的交互式命令行工具以及面向?qū)ο蟮哪_本技術(shù)。Monad也被稱為MSH,是下一代的Windows命令shell,用全新的角度來(lái)完成各式各樣的管理任務(wù)。
Monad定義的要素有哪些?
在定義 Monad 時(shí)需要提供一個(gè)類型構(gòu)造器 M 和兩個(gè)操作 unit 和 bind:
1、類型構(gòu)造器的作用是從底層的類型中創(chuàng)建出一元類型(monadic type)。如果 M 是 Monad 的名稱,而 t 是數(shù)據(jù)類型,則 M t 是對(duì)應(yīng)的一元類型。
2、unit 操作把一個(gè)普通值 t 通過(guò)類型構(gòu)造器封裝在一個(gè)容器中,所產(chǎn)生的值的類型是 M t。unit 操作也稱為 return 操作。return 操作的名稱來(lái)源于 Haskell。不過(guò)由于 return 在很多編程語(yǔ)言中是保留關(guān)鍵詞,用 unit 做名稱更為合適。
3、bind 操作的類型聲明是 (M t)→(t→M u)→(M u)。該操作接受類型為 M t 的值和類型為 t → M u 的函數(shù)來(lái)對(duì)值進(jìn)行轉(zhuǎn)換。在進(jìn)行轉(zhuǎn)換時(shí),bind 操作把原始值從容器中抽取出來(lái),再應(yīng)用給定的函數(shù)進(jìn)行轉(zhuǎn)換。函數(shù)的返回值是一個(gè)新的容器值 M u,M u 可以作為下一次轉(zhuǎn)換的起點(diǎn)。多個(gè) bind 操作可以級(jí)聯(lián)起來(lái),形成處理流水線。
具體代碼示例如下:
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?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 >?transforms)?{ ?LoggingMonad?result?=?monad; ?for?(Function ?transform?:?transforms)?{ ?result?=?bind(result,?transform); ?} ?return?result; ?} ? ?public?static?void?main(String[]?args)?{ ?Function ?transform1?= ?v?->?new?LoggingMonad<>(v?*?4,?List.of(v?+?"?*?4")); ?Function ?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]} ?} }
以上就是小編今天的分享了,希望可以幫助到大家。