我有这行代码:
map (\(u,v) -> flatTorus n u v) gridUV
Hlint
建议我用
map (uncurry (flatTorus n)) gridUV
这个建议的动机是什么?它只是为了简短,还是其他(性能)?因为虽然它更长,但我发现第一个代码更容易阅读。
事实上,我的问题更笼统,因为这只是一个例子:Hlint
建议通常只是基于简短的动机,还是建议背后有其他改进?
我认为 Hlint 更喜欢使用uncurry
,因为它为您提供了回调的不变表示。Lambda 表达式本质上对表示很敏感,因为
\(u, v) -> flatTorus n u v
相当于
\(x, y) -> flatTorus n x y
即使它们在文本上有所不同。
使用uncurry
使读者摆脱了在头脑中进行 alpha 等价的认知负担(例如,认识到上述两个表达式是相同的),但随后又使他们背负了必须记住组合子词汇的认知负担。归根结底,这是一个品味问题。
这些实际上并不完全等效。
(\(x, y) -> (,) x y) undefined = undefined
uncurry (,) undefined = (undefined, undefined)
你应该接受任何建议uncurry
与一粒盐一起使用吗?想想这种额外的懒惰是否会有所帮助、伤害或没有影响。