我经常发现自己想要使用类似以下的功能:
zipWithMap :: (a -> b) -> [a] -> [(a, b)]
zipWithMap f xs = zip xs $ map f xs
这样:
zipWithMap (+3) [1..4] = [(1, 4), (2, 5), (3, 6), (4, 7)]
实际上,我发现自己经常在寻找这种东西,以至于我担心自己要么重新发明轮子,要么使用惯于使用Haskell的惯用法,以至于Real Programmers不再使用它,因此将其从stdlib中排除。
Hoogle gives me nothing with that type signature,所以我不得不问:还有一种惯用的方法吗?也许用箭?
zipWithMap f = map $ id &&& f
尽管我不确定这是否比上面的(主观上)简单的样式更好。
最佳答案
也:
Data.Tuple.Extra> map (second (+3) . dupe) [1..4]
[(1,4),(2,5),(3,6),(4,7)]