我经常发现自己想要使用类似以下的功能:

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)]

07-24 09:55