Haskell中zip替代方案:如何修改函数返回三元组列表?
解决方案:扩展Haskell函数返回三元组列表
嗨,这个问题其实很好解决,Haskell里有几种简洁的方式来实现你想要的效果——把原来的二元组列表扩展成带输入字符串的三元组列表。我给你列几个常用的实现方法:
方法1:使用zip3直接打包三个列表
Haskell标准库提供了zip3函数,它可以把三个列表对应位置的元素打包成三元组的列表,刚好满足你的需求。我们只需要生成一个和x、y长度相同,每个元素都是输入s的列表,这里用repeat s就很方便(zip3会自动取三个列表中最短的长度,而你的x和y来自同一个s,长度应该是一致的):
f :: String -> [(Int, Int, String)] f s = zip3 x y (repeat s) where x = g s y = h s
方法2:基于原有zip结果扩展三元组
如果你更习惯用原来的zip逻辑,也可以先得到二元组列表,再通过map给每个二元组加上输入字符串s:
f :: String -> [(Int, Int, String)] f s = map (\(a, b) -> (a, b, s)) (zip x y) where x = g s y = h s
方法3:用列表推导式直观实现
列表推导式在处理这类元素转换时可读性很高,直接遍历zip生成的二元组,每个元素都带上s即可:
f :: String -> [(Int, Int, String)] f s = [(a, b, s) | (a, b) <- zip (g s) (h s)]
注意事项
这几种方法都依赖一个前提:g s和h s返回的列表长度相同——这也是你原来使用zip的必要条件,所以不需要额外调整。
内容的提问来源于stack exchange,提问作者Monika
相关产品推荐
相关产品推荐

