我有这行代码:
map (\(u,v) -> flatTorus n u v) gridUV
Hlint
建议我用
map (uncurry (flatTorus n)) gridUV
这个建议的动机是什么?它只是为了简短,还是其他(性能)?因为虽然它更长,但我发现第一个代码更容易阅读。
事实上,我的问题更为笼统,因为这只是其中一个例子:Hlint
建议通常只基于短期动机,还是建议背后有其他改进?
答案 0 :(得分:2)
我认为Hlint更喜欢使用uncurry
,因为它为您提供了回调的不变表示。 Lambda表达式本身对表示很敏感,因为
\(u, v) -> flatTorus n u v
相当于
\(x, y) -> flatTorus n x y
即使它们在文本上有所不同。
使用uncurry
释放读者的头脑中做α等价的认知负荷(例如,认识到上述两个表达式是相同的),但随后又让他们厌倦了必须记住词汇量的认知负担组合子。最终,这是一个品味问题。
答案 1 :(得分:1)
这些实际上并不完全相同。
(\(x, y) -> (,) x y) undefined = undefined
uncurry (,) undefined = (undefined, undefined)
你应该采取任何建议,使用uncurry
一粒盐。想想这种额外的懒惰是否会有所帮助,伤害或没有任何区别。