繁体   English   中英

Haskell-错误地图函数返回列表

[英]Haskell - Error map function returning a list

我想做的就是将stoline函数应用于传递给stomap的列表的每个元素( String )。

stoline类型: stoline :: String -> [Obj]

这是我的代码:

stomap :: [[String]] -> [Obj]
stomap [[val]] = stoline val
stomap (val:vals) = map (\a -> stoline a) val ++ ...

传递给stomap的数据stomap[["0","133","2"],["6","0","0"],["656","0","3"]]


错误 :在stoline的返回类型中,无法将期望的类型Obj与实际类型[Obj]stoline
问题是map函数返回一个列表(并且不应该!),但是我真的不知道如何避免这个问题。

您的第一种情况是不必要的,而第二种情况有一个错误:

map (\a -> stoline a) val ++ ...

val在这里是[String] ,因此map (\\a -> stoline a) val[[Obj]] 由于您正在使用++将其与其余结果组合在一起,因此最终结果将是[[Obj]]类型,而不是[Obj]

让我们重做一下:

stomap :: [[String]] -> [Obj]
stomap lolos = concatMap (\los -> concatMap (\s -> stoline s) los) lolos

lolos是字符串列表的列表, los是字符串列表,而s是字符串。

我们使用concatMap这里,而不是普通map ,因为我们要生成对象的单一列表[Obj]没有对象的名单列表的嵌套列表[[[Obj]]]因为我们正在运行stoline上输入中的每个String时,我们需要遍历lolos折叠该结构。

我们可以通过使它无指向性来清理上面的代码(使其更加轻巧)。 \\s -> stoline sstoline相同,因此我们可以:

stomap lolos = concatMap (\los -> concatMap stoline los) lolos

\\los -> concatMap stoline losconcatMap stoline相同,因此我们可以将其减少为:

stomap lolos = concatMap (concatMap stoline) lolos

我们可以从双方抛弃论点,给我们:

stomap = concatMap (concatMap stoline)

乍一看似乎难以辨认,但是对有经验的haskeller来说,这比您的原始代码看得更清楚-对我而言,很明显,此最新版本仅在列表列表中组合了stoline的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM