2 2 zio入門 按順序組合ZIO

2021-10-17 20:25:27 字數 2271 閱讀 7989

正如上小節所述,zio效果是描述併發工作流的藍圖,並且我們通過轉換和組合更小,更簡單的效果來構建更複雜的效果,從而解決業務問題。

我們看到了如何使用 zio 的 delay 運算子將乙個效果轉換為另一種效果,並將其執行延遲到將來。 除了延遲之外,zio還擁有數十種其他強大的運算子,它們可以轉換並組合效果以解決現代應用程式開發中的常見問題。

我們將在隨後的章節中學習大多數這些運算子,但是我們需要介紹的最重要的運算子之一就是flatmap。zio效果的flatmap方法表示兩個效果的順序組合,使我們可以根據第乙個效果的輸出來建立第二個效果。

flatmap的簡化型別簽名如下所示:

trait zio[r, e, a]

實際上,flatmap的意思是說:「先執行第乙個效果,然後根據第乙個執行的結果執行第二個效果」。 使用此順序運算子,我們可以描述乙個簡單的工作流,該工作流讀取使用者輸入,然後將輸入顯示給使用者,如以下**片段所示:

// 下面的程式將兩個沒有關係的effect通過flatmap串成乙個effect

import scala.io.stdin

val readline = zio.effect(stdin.readline())

def printline(line:

string

)=zio.effect(println(line)

)val echo = readline.flatmap(line => printline(line)

)

請注意,我們在控制台上列印的內容取決於我們從控制台讀取的內容:因此,我們依次執行兩件事,而我們所做的第二件事取決於我們所做的第一件事所產生的結果。

flatmap基本的運算子,因為它捕獲了在程式中語句的執行方式:後面的語句取決於前面的語句計算的結果。

如果我們通過過程式的**編寫這段程式就是:

val line = console.readline console.println(line)
過程程式設計與flatmap運算子之間的這種關係是如此精確,我們實際上可以通過將每個簡單的語句包裝在諸如zio.effect之類的建構函式中,然後使用flatmap將這些語句粘合在一起,從而將任何程式程式轉換為zio。

例如,假設我們在以下**段中顯示了程式程式:

val data = doquery(query)

val response = generateresponse(data) writeresponse(response)

我們可以將上面的**轉變為下面的形式:

zio

.effect(doquery(query)

).flatmap(

data =>

zio.effect(generateresponse(data)

).flatmap(response => zio.effect(writeresponse(response)))

)

儘管是一種簡單的轉換,但是如果連續超過兩個或三個flatmap操作,**的巢狀將變得有些困難。 幸運的是,scala具有for推導的功能,該功能使我們能夠以類似於過程程式設計的方式表達順序組合。

在下一節中,我們將詳細**各種理解。

通過 for 推導,我們可以將下面的**:

readline.flatmap(line => printline(line)

)

重寫成下面的形式:

import zio._

val echo =

foryield()

}

從這個簡短的**片段中可以看出,沒有巢狀,並且理解中的每一行看起來都類似於過程程式設計中的一條語句。

for推導具有如下的結構:

scala將具有n行的for推導轉換為對效果的flatmap方法的n-1次呼叫,最後對最後乙個作用呼叫map方法。

例如:

for

yield x + y + z

scala程式會將上面的**轉為下面的語句

doa.flatmap(x => dob(x)

.flatmap(y => doc(x, y)

.map(z => x + y + z)

))

許多scala開發人員發現,for推導比起一連串的flatmap巢狀呼叫更容易理解。 在本書中,除了非常簡短的摘錄外,我們更喜歡for推導而不是顯式呼叫flatmap。

2 4 zio入門 ZIO型別引數

我們之前說過,型別zio r,e,a 的值是一種 functional effect,需要環境r,並且可能因e失敗或成功返回a。現在,我們也了解了zio effect 成為併發工作流程的藍圖意味著什麼,以及如何組合效果,下面讓我們詳細討論每個zio型別引數 以下 段定義了這種 zio effect ...

pytorch入門與實踐 2 2

tensor 1 本質上可以理解為具有不同維度的陣列 2 支援的基本運算 建立tensor x t.tensor x,y x,y 表示陣列的大小 x t.rand x,y x t.ones x,y 獲取tensor的大小 x.size 加法運算 普通加法 返回新的變數 x t.tensor a,b ...

Erlang22 如何按規則位數輸出數字

需求 把乙個數字指定長度輸出 例如 100000001 1200000012 1203 00001203 123456789 123456789 1234567 01234567 方法一 使用io lib format來構造 方法說明見 使用io fromat來輸出 f.p.padmodc.f.4....