如何将`[[String c]]`转换成`字符串[[c]]`?

Leo*_*ang 2 haskell

说我有两个功能:

b2c :: B -> Either String C
a2bs :: A -> [[B]]
Run Code Online (Sandbox Code Playgroud)

如何使下面的a2cs使用功能b2ca2bs这样的,如果有在任何左值,[[Either String c]]那么Either String [[c]]应该是左值?

a2cs :: A -> Either String [[C]]
Run Code Online (Sandbox Code Playgroud)

Dan*_*ner 6

我会写这个:

a2cs = traverse (traverse b2c) . a2bs
Run Code Online (Sandbox Code Playgroud)

虽然这并没有完全使用您提出的实现策略,[[Either String C]]即先生成a 然后将其展平Either String [[C]],但它的优势在于它只需要通过嵌套列表一次,而不是策略所需的两次.


Car*_*arl 5

你可以使用sequence它,但这不是一个步骤.它传递一对类型构造函数的层,但是您需要将Either String构造函数移出两个类型层.好吧,我们的老朋友map派上用场了.

foo1 :: [[Either String c]] -> [Either String [c]]
foo1 = map sequence
Run Code Online (Sandbox Code Playgroud)

然后继续前进:

foo2 :: [Either String [c]] -> Either String [[c]]
foo2 = sequence
Run Code Online (Sandbox Code Playgroud)

如果你想要更紧凑,你可以把它与功能组合放在一起: sequence . map sequence :: [[Either String c]] -> Either String [[c]]