[英]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 s
与stoline
相同,因此我们可以:
stomap lolos = concatMap (\los -> concatMap stoline los) lolos
\\los -> concatMap stoline los
与concatMap stoline
相同,因此我们可以将其减少为:
stomap lolos = concatMap (concatMap stoline) lolos
我们可以从双方抛弃论点,给我们:
stomap = concatMap (concatMap stoline)
乍一看似乎难以辨认,但是对有经验的haskeller来说,这比您的原始代码看得更清楚-对我而言,很明显,此最新版本仅在列表列表中组合了stoline
的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.