从Haskell的列表中获取第一个权利

apl*_*vin 3 haskell list either

首先,我有一个(无限的)Eithers 列表,它是这样产生的:

x :: A
...

f :: A -> Either B A
...

xs :: [Either B A]
xs = iterate (>>=f) (Right x)
Run Code Online (Sandbox Code Playgroud)

该列表将包含几个Rights(总是有限数字),然后Left重复相同的值.我需要的是把所有的Rights和一个跟Left在它们之后.在这种特殊情况下,也可以通过更改函数来完成,但我也对最佳通用方法感兴趣.

Dan*_*ner 9

让我建议一个更具侵略性的变化.代替

x :: A
f :: A -> Either B A
xs :: [Either B A]
Run Code Online (Sandbox Code Playgroud)

考虑

x :: A
f :: A -> Writer [A] B
Run Code Online (Sandbox Code Playgroud)

xs完全忘记.以前f只是迭代的一个步骤,它现在是递归的; 在它回归之前Right a,你现在tell [a] >> f a; 在它回归之前Left b,你现在return b.

如果确实有必要,你仍然可以访问各个部分Writer,即[A]and B,via execWriterevalWriter(或者通过使用runWriter它们同时访问它们):

xs :: [A]
b :: B
(xs, b) = runWriter (f x)
Run Code Online (Sandbox Code Playgroud)


ham*_*mar 5

您可以使用spanRight元素和元素之间拆分列表Left,然后使用模式匹配来获取第一个元素Left.

(rights, firstLeft : _) = span isRight xs
    where isRight (Right _) = True
          isRight _         = False
Run Code Online (Sandbox Code Playgroud)

  • 你也可以定义"isRight =(const False)(const True)" (2认同)