簡體   English   中英

如何檢查 Haskell 中一種代數類型列表中的所有元素?

[英]How to check if all the element in the list of one algebraic type in Haskell?

如果我有以下代數數據類型

type MyVal = Either String Int

並有一個包含 MyVal 類型元素的列表

ls = [Right 1, Right 2, Right 3]
xs = [Right 1, Left "error", Right 3]

現在,我想寫 function 來找出我的列表中的所有值都是“Right”,那么它應該返回 True,否則返回 False。

對於ls它將返回 True,對於xs它將返回 False。

我怎樣才能做到這一點?

我嘗試使用all function 但無法正確使用。

不要否認all isRight作為對所提出問題的一個很好的答案,我會在某種程度上質疑這個問題。 作為Bool計算列表中的所有Either值是否都是Right有什么好處? 它能讓你做什么? 一個答案是它使您有權從整個列表中刪除Right標簽,將整個列表視為無錯誤。

一個提供更多信息的選項可能是構造一些類型的東西

[Either String Int] -> Either String [Int]

這樣您就可以獲得所有未標記的Int或與第一個討厭的Left相關聯的消息,而不是僅僅TrueFalse

並且有一個標准的 function 可以做到這一點(以及除此之外的許多其他事情)。 它利用了這樣一個事實:列表是具有標准遍歷模式的數據結構,並且Either String使用標准的失敗和成功傳播模式對錯誤管理計算的概念進行編碼。 該類型已經完成了艱苦的工作。 你只需要說...

sequenceA

您可以使用 isRight isRight:: Either ab -> Bool function 檢查Either ab值是否是Right x

因此,您可以通過以下方式實現:

import Data.Either(isRight)

allRight :: Foldable f => f (Either a b) -> Bool
allRight = all isRight

這給了我們預期的 output:

Prelude Data.Either> allRight ls
True
Prelude Data.Either> allRight xs
False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM