Hlint建议:使用不合格

时间:2018-03-15 12:40:16

标签: haskell hlint

我有这行代码:

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

Hlint建议我用

替换它
map (uncurry (flatTorus n)) gridUV

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

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

2 个答案:

答案 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一粒盐。想想这种额外的懒惰是否会有所帮助,伤害或没有任何区别。