」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 探索 Effect-TS 中的選項轉換

探索 Effect-TS 中的選項轉換

發佈於2024-07-30
瀏覽:415

Exploring Option Conversions in Effect-TS

Effect-TS 提供了处理 Option 和 Either 类型的强大工具。在本文中,我们将探索使用库的实用函数转换和操作这些类型的各种方法。

示例 1:使用 O.getRight 将 Either 转换为 Option

O.getRight 函数将 Either 转换为 Option,并丢弃错误。如果 Either 正确,则返回 O.some(value),否则返回 O.none.

import { Option as O, Either as E, pipe } from 'effect';

function conversions_ex01() {
  const eitherRight = E.right('ok'); // Create an Either containing the value 'ok'
  const eitherLeft = E.left('error'); // Create an Either representing an error

  console.log(O.getRight(eitherRight)); // Output: Some('ok')
  console.log(O.getRight(eitherLeft)); // Output: None
}

示例 2:使用 O.getLeft 将 Either 转换为 Option

O.getLeft 函数将 Either 转换为 Option,并丢弃该值。如果Either为Left,则返回O.some(error),否则返回O.none.

import { Option as O, Either as E, pipe } from 'effect';

function conversions_ex02() {
  const eitherRight = E.right('ok'); // Create an Either containing the value 'ok'
  const eitherLeft = E.left('error'); // Create an Either representing an error

  console.log(O.getLeft(eitherRight)); // Output: None
  console.log(O.getLeft(eitherLeft)); // Output: Some('error')
}

示例 3:使用 O.getOrElse 获取值或默认值

O.getOrElse 函数如果是 Some,则返回 Option 内的值,否则返回提供的默认值。

import { Option as O, pipe } from 'effect';

function conversions_ex03() {
  const some = O.some(1); // Create an Option containing the value 1
  const none = O.none(); // Create an Option representing no value

  console.log(
    pipe(
      some,
      O.getOrElse(() => 'default')
    )
  ); // Output: 1 (since some contains 1)
  console.log(
    pipe(
      none,
      O.getOrElse(() => 'default')
    )
  ); // Output: 'default' (since none is None)
}

示例 4:使用 O.orElse 链接选项

O.orElse 函数返回提供的 Option,如果 self 为 None,否则返回 self。此函数允许选项链接,其中后备是另一个选项。

import { Option as O, pipe } from 'effect';

function conversions_ex04() {
  const some1 = O.some(1); // Create an Option containing the value 1
  const some2 = O.some(2); // Create an Option containing the value 2
  const none = O.none(); // Create an Option representing no value

  console.log(
    pipe(
      some1,
      O.orElse(() => some2)
    )
  ); // Output: Some(1) (since some1 contains 1)
  console.log(
    pipe(
      none,
      O.orElse(() => some2)
    )
  ); // Output: Some(2) (since none is None and fallback is some2)
}

示例 5:使用 O.orElseSome 回退到默认值

如果 self 为 None,O.orElseSome 函数将返回包含在 Some 中的提供的默认值,否则返回 self。此函数允许链接选项,其中回退是包含在 Some.
中的默认值

import { Option as O, pipe } from 'effect';

function conversions_ex05() {
  const some = O.some(1); // Create an Option containing the value 1
  const none = O.none(); // Create an Option representing no value

  console.log(
    pipe(
      some,
      O.orElseSome(() => 2)
    )
  ); // Output: Some(1) (since some contains 1)
  console.log(
    pipe(
      none,
      O.orElseSome(() => 2)
    )
  ); // Output: Some(2) (since none is None and fallback is 2)
}

示例 6:使用 O.orElseEither 将选项与 Either 上下文链接起来

O.orElseEither 函数返回一个包含 Either 的选项,其中 Left 来自后备选项,Right 来自原始选项。此函数允许链接选项,其中后备提供“任一”以获取更多上下文。

import { Option as O, Either as E, pipe } from 'effect';

function conversions_ex06() {
  const some1 = O.some(1); // Create an Option containing the value 1
  const some2 = O.some(2); // Create an Option containing the value 2
  const none = O.none(); // Create an Option representing no value

  console.log(
    pipe(
      some1,
      O.orElseEither(() => some2)
    )
  ); // Output: Some(Right(1)) (since some1 contains 1)
  console.log(
    pipe(
      none,
      O.orElseEither(() => some2)
    )
  ); // Output: Some(Left(2)) (since none is None and fallback is some2)
}

示例 7:使用 O.firstSomeOf 查找 Iterable 中的第一个 Some

O.firstSomeOf 函数返回在可迭代选项中找到的第一个 Some。如果全部为None,则返回None。

import { Option as O } from 'effect';

function conversions_ex07() {
  const options = [O.none(), O.some(1), O.some(2)]; // Create an iterable of Options
  const optionsAllNone = [O.none(), O.none()]; // Create an iterable of None Options

  console.log(O.firstSomeOf(options)); // Output: Some(1) (since the first non-None Option is Some(1))
  console.log(O.firstSomeOf(optionsAllNone)); // Output: None (since all Options are None)
}

示例 8:使用 O.toRefinement 将返回选项的函数转换为类型保护

O.toRefinement 函数将返回 Option 的函数转换为类型保护,允许更具体的类型检查。

import { Option as O } from 'effect';

function conversions_ex08() {
  const isPositive = (n: number): O.Option => n > 0 ? O.some(n) : O.none();
  const isPositiveRefinement = O.toRefinement(isPositive);

  console.log(isPositiveRefinement(1)); // Output: true (since 1 is positive)
  console.log(isPositiveRefinement(-1)); // Output: false (since -1 is not positive)
}

示例 9:使用 O.toArray 将选项转换为数组

O.toArray 函数将 Option 转换为数组。如果Option为Some,则返回包含该值的数组;如果为 None,则返回空数组。

import { Option as O } from 'effect';

function conversions_ex09() {
  const some = O.some(1); // Create an Option containing the value 1
  const none = O.none(); // Create an Option representing no value

  console.log(O.toArray(some)); // Output: [1] (since some contains 1)
  console.log(O.toArray(none)); // Output: [] (since none is None)
}

结论

在本文中,我们探索了 Effect-TS 提供的用于转换和操作 Option 和 Either 类型的各种函数。这些函数增强了代码的灵活性和表现力,使您能够更优雅地处理可选值和容易出错的值。无论您需要将 Either 转换为 Option、链接多个 Option 值还是执行类型安全操作,Effect-TS 都提供了一组强大的工具来简化这些任务。通过利用这些实用程序,您可以编写更清晰、更易于维护的代码,以有效处理值的存在或不存在。

版本聲明 本文轉載於:https://dev.to/almaclaine/exploring-option-conversions-in-effect-ts-3bpk?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-21
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-21
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-12-21
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-21
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-21
  • 如何在 Python 中存取和處理命令列參數?
    如何在 Python 中存取和處理命令列參數?
    在 Python 中處理命令列參數在 Python 中,命令列參數位於名為 sys.argv 的清單中。若要存取這些參數,請使用下列語法:import sys # Print all command line arguments print("\n".join(sys.argv)...
    程式設計 發佈於2024-12-20
  • Python If 語句中邏輯 AND (&&) 運算子的等價物是什麼?
    Python If 語句中邏輯 AND (&&) 運算子的等價物是什麼?
    Python中的If語句中&&(邏輯與)的等價是什麼? 在Python中,無法像其他程式語言一樣使用&&作為邏輯與運算子。使用if語句時,必須使用and關鍵字。 範例:以下範例嘗試使用&&作為邏輯與運算符,但會引發語法錯誤:if cond1 &amp;&amp; cond2:正確方法...
    程式設計 發佈於2024-12-20
  • 如何修改 Go 中作為函數參數傳遞的切片?
    如何修改 Go 中作為函數參數傳遞的切片?
    將切片作為函數參數傳遞並修改原始切片在Go 中,將參數傳遞給函數是按值完成的,這意味著對參數所做的任何更改函數內的內容不會反映在原始變數中。當使用可變資料類型(例如切片)時,這可能會出現問題,因為附加到函數內的切片不會影響超出函數範圍的原始切片。 考慮以下範例:nums := []int{1, 2,...
    程式設計 發佈於2024-12-20
  • 為什麼模板類別定義必須包含在頭檔中?
    為什麼模板類別定義必須包含在頭檔中?
    在頭文件中包含模板類定義:必要性問題是為什麼需要模板類的實現和聲明駐留在同一頭文件中。為了解決這個問題,至關重要的是要了解編譯器需要存取整個模板定義(而不僅僅是其簽名)才能為模板的每個實例化產生程式碼。因此,函數定義必須移至標題。 包含模型提供了對此要求的全面解釋。本質上,當實例化模板類別時,編譯器...
    程式設計 發佈於2024-12-20
  • 在 JavaScript 中使用浮點數時如何控制小數精確度?
    在 JavaScript 中使用浮點數時如何控制小數精確度?
    控制 JavaScript 中的小數精度在 JavaScript 中處理浮點數時,您可能會遇到需要控制小數點後顯示的位數的情況觀點。例如,您可能希望只顯示兩位小數的價格。 以固定精度格式化浮點型為了實現此目的,JavaScript 提供了 toFixed() 函數。此函數採用一個參數來指定要保留的小...
    程式設計 發佈於2024-12-20
  • 填充空 Python 清單時如何避免 IndexError?
    填充空 Python 清單時如何避免 IndexError?
    修復將元素分配給列表時的IndexError嘗試通過依次分配每個元素來創建列表時,您可能會遇到IndexError如果目標清單最初為空。出現此錯誤的原因是您試圖存取清單中不存在的索引。 要解決此問題並將元素正確添加到列表中,您可以使用追加方法:for l in i: j.append(l)此...
    程式設計 發佈於2024-12-20
  • 如何在 Android 中解析 ISO 8601 日期/時間字串?
    如何在 Android 中解析 ISO 8601 日期/時間字串?
    在Android 解析ISO 8601 日期/時間字串問題:您已收到來自Web 服務的標準ISO 8601字串,例如“2010-10-15T09:27:37Z”。如何在Android中將此字串轉換為日期/時間物件以進行進一步操作? 答案:Android提供了一個SimpleDateFormat類,讓...
    程式設計 發佈於2024-12-20
  • 如何使用正規表示式檢測 URL(包括裸 URL)?
    如何使用正規表示式檢測 URL(包括裸 URL)?
    使用正規表示式偵測 URL您目前的程式碼無法符合缺少「http://」前綴的裸 URL。為了解決這個問題,可以考慮採用綜合正規表示式:https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\ ~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9(...
    程式設計 發佈於2024-12-20
  • 如何在 AngularJS 中有效地求和數組屬性?
    如何在 AngularJS 中有效地求和數組屬性?
    AngularJS 中的高級數組求和在 AngularJS 中,對數組屬性求和可能是一項常見任務。基本方法包括迭代數組並累積屬性值。然而,當面對多個陣列和不同的屬性名稱時,這種方法變得乏味。 為了解決這個問題,需要一個更靈活、可重複使用的解決方案,它允許對任何陣列屬性進行方便的求和。這可以使用 re...
    程式設計 發佈於2024-12-20

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3