4

我有这行代码:

map (\(u,v) -> flatTorus n u v) gridUV

Hlint建议我用

map (uncurry (flatTorus n)) gridUV

这个建议的动机是什么?它只是为了简短,还是其他(性能)?因为虽然它更长,但我发现第一个代码更容易阅读。

事实上,我的问题更笼统,因为这只是一个例子:Hlint建议通常只是基于简短的动机,还是建议背后有其他改进?

4

2 回答 2

2

我认为 Hlint 更喜欢使用uncurry,因为它为您提供了回调的不变表示。Lambda 表达式本质上对表示很敏感,因为

\(u, v) -> flatTorus n u v

相当于

\(x, y) -> flatTorus n x y

即使它们在文本上有所不同。

使用uncurry使读者摆脱了在头脑中进行 alpha 等价的认知负担(例如,认识到上述两个表达式是相同的),但随后又使他们背负了必须记住组合子词汇的认知负担。归根结底,这是一个品味问题。

于 2018-03-16T06:35:27.923 回答
1

这些实际上并不完全等效。

(\(x, y) -> (,) x y) undefined = undefined
uncurry (,) undefined = (undefined, undefined)

你应该接受任何建议uncurry与一粒盐一起使用吗?想想这种额外的懒惰是否会有所帮助、伤害或没有影响。

于 2018-03-16T07:53:19.370 回答