Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何将“[[Orther String c]]”转换为“Orther String[[c]]”?_Haskell - Fatal编程技术网

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。序列撰写