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在它们之后.在这种特殊情况下,也可以通过更改函数来完成,但我也对最佳通用方法感兴趣.
让我建议一个更具侵略性的变化.代替
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 execWriter和evalWriter(或者通过使用runWriter它们同时访问它们):
xs :: [A]
b :: B
(xs, b) = runWriter (f x)
Run Code Online (Sandbox Code Playgroud)
您可以使用span在Right元素和元素之间拆分列表Left,然后使用模式匹配来获取第一个元素Left.
(rights, firstLeft : _) = span isRight xs
where isRight (Right _) = True
isRight _ = False
Run Code Online (Sandbox Code Playgroud)