Haskell Stdlib是我的zipWithMap函数的同义词?
我经常发现自己希望使用以下功能:Haskell Stdlib是我的zipWithMap函数的同义词?,haskell,Haskell,我经常发现自己希望使用以下功能: 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的习惯用法,以至于真正的程序员已经离开了它,从而将
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的习惯用法,以至于真正的程序员已经离开了它,从而将它排除在stdlib之外
,所以我不得不问:有没有更惯用的方法?也许是用箭
zipWithMap f = map $ id &&& f
虽然我不确定这是否比上面(主观上)简单的风格好。另外:
Data.Tuple.Extra> map (second (+3) . dupe) [1..4]
[(1,4),(2,5),(3,6),(4,7)]
我认为
map(id&&f)
足够简单和简短,它不需要自己的名字。同意,尽管我个人希望前奏曲包含(等效的)fanout fgx=(fx,gx)
,这在伯德的作品中经常出现。这将使这个映射。fanout id
zip-map f
@WillNess虽然我发现应用程序版本比箭头版本更整洁,但我相信它不会优化。@HTNW-hmm,的确如此。太糟糕了,嗯。