【发布时间】:2018-03-15 12:40:15
【问题描述】:
我有这行代码:
map (\(u,v) -> flatTorus n u v) gridUV
Hlint 建议我用
map (uncurry (flatTorus n)) gridUV
这个建议的动机是什么?它只是为了简短,还是其他(性能)?因为虽然它更长,但我发现第一个代码更容易阅读。
事实上,我的问题更笼统,因为这只是一个例子:Hlint 的建议通常只是基于短促动机还是建议背后有其他改进?
【问题讨论】:
-
我猜想更具可读性:如果你知道
uncurry做了什么,那么人们就不必考虑正在发生的事情了。我还认为hlint建议map (uncurry (flatTorus n)) gridUV(带有一对额外的括号)。 -
我认为
hlint的建议以简洁性和可读性为指导。他们中的一些人可能会在社区中找到一个强有力的协议。其他的,比如这个,没有那么多。就个人而言,我发现第二个代码并不比第一个好多少。我会说它们几乎是等价的。也许hlint也应该重视它的建议。 -
@StéphaneLaurent:很好地使用
x!!0和head x都不是很优雅。您最好为此使用模式匹配,因为不能保证列表具有元素。事实上head、tail、(!!)和length是应该避免的函数。 -
@StéphaneLaurent 我会写
let [a,b,c] = x in Vertex3 a b c -
@Li-yaoXia:嗯,我认为你必须保留一个(可能是空的尾巴)。但你可以喜欢:
f (x0:x1:x2:_) = Vertex x0 x1 x2; f _ = <something else>