说我有两个功能:
b2c :: B -> Either String C
a2bs :: A -> [[B]]
Run Code Online (Sandbox Code Playgroud)
如何使下面的a2cs使用功能b2c和a2bs这样的,如果有在任何左值,[[Either String c]]那么Either String [[c]]应该是左值?
a2cs :: A -> Either String [[C]]
Run Code Online (Sandbox Code Playgroud)
我会写这个:
a2cs = traverse (traverse b2c) . a2bs
Run Code Online (Sandbox Code Playgroud)
虽然这并没有完全使用您提出的实现策略,[[Either String C]]即先生成a 然后将其展平Either String [[C]],但它的优势在于它只需要通过嵌套列表一次,而不是策略所需的两次.
你可以使用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]]