[英]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
相關聯的消息,而不是僅僅True
或False
。
並且有一個標准的 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.