Haskell 如何将“[[Orther String c]]”转换为“Orther String[[c]]”?
假设我有两个功能:Haskell 如何将“[[Orther String c]]”转换为“Orther String[[c]]”?,haskell,Haskell,假设我有两个功能: b2c :: B -> Either String C a2bs :: A -> [[B]] 如何使用b2c和a2bs实现以下a2cs功能,以便如果[[任一字符串c]]]中存在任何左值,则任一字符串[[c]]应为左值 a2cs :: A -> Either String [[C]] 你可以使用它,但这不是一个单一的步骤。它转换类型构造函数的一对层,但是您需要将任一字符串构造函数移出两个类型层。嗯,我们的老朋友map派上了用场 foo1 :: [[Eith
b2c :: B -> Either String C
a2bs :: A -> [[B]]
如何使用b2c
和a2bs
实现以下a2cs
功能,以便如果[[任一字符串c]]]
中存在任何左值,则任一字符串[[c]]
应为左值
a2cs :: A -> Either String [[C]]
你可以使用它,但这不是一个单一的步骤。它转换类型构造函数的一对层,但是您需要将任一字符串
构造函数移出两个类型层。嗯,我们的老朋友map
派上了用场
foo1 :: [[Either String c]] -> [Either String [c]]
foo1 = map sequence
然后继续剩下的过程:
foo2 :: [Either String [c]] -> Either String [[c]]
foo2 = sequence
如果您想更紧凑,可以将其与函数组合:
sequence组合在一起。映射顺序::[[Orther String c]]->Orther String[[c]]
首先将您的[[Orther String c]]
转换为[Orther String[c]]]
,然后将其转换为Orther String[[c]]
,如下所示:
func = sequence . map sequence
func [[Right 1, Right 2], [Left "a"]]
> Left "a"
func [[Right 1, Right 2], [Right 3]]
> Right [[1,2][3]]
我将写下:
a2cs = traverse (traverse b2c) . a2bs
虽然这并不完全使用您建议的实现策略,即首先生成
[[orther String C]]
,然后将其展平为orther String[[C]]
,它的优点是只需对嵌套列表进行一次遍历,而不是您的策略所需的两次遍历。当您说b2c
的类型是b->字符串c
,它实际上不是b
,是吗?这是其他更具体的类型,而不是类型变量。。。另一个函数也是一样的,对吗?是的,类型签名中的a、b、c都是具体的类型。当你说如果有任何Left
值,那么字符串[[c]]
应该是Left
值,应该是哪个?左边应该是什么?级联字符串?@ LeoZug考虑在类型中用大写字母书写它们。小写起始标识符保留给类型变量。简单的解决方案是getCompose序列(Compose[[Right 10,Right 20]])
或f=fmap-getCompose。序列撰写