考虑:
myFunction :: (Eq a) => a -> a -> [a]
myFunction v1 v2 = statement_1.. $ statement_2... $ statement_3...
对比
myFunction :: (Eq a) => a -> a -> [a]
myFunction v1 v2 = statement_1 result_1 result_2
where
result_2 = statement_2
result_3 = statement_3
Haskell 中是否有关于首选哪种格式的经验法则?对于何时使用每个版本有任何具体规则吗?
最佳答案
首先,这些实际上并不等同。 f $ x $ y
被解析为 f $ (x $ y)
(因为 infixr 0 $
),因此您实际上需要将第一个版本写为
myFunction v1 v2 = (statement_1.. $ statement_2...) $ statement_3...
或者,如果 statement_1
实际上只是一个符号,我实际上更喜欢
myFunction v1 v2 = statement_1 (statement_2...) (statement_3...)
确实,您的问题是为这些中间结果指定自己的名称是否有意义。嗯,这个问题与 Haskell 没有什么关系——它适用于大多数编程语言,尽管很少有语言能够像 Haskell 一样在单个表达式中编写如此多的内容。只能回答为:如果可以让代码更容易理解的话,给它们起个名字。也许很难看出 statement_2 ...
的用途是什么,但是“单个词注释”就能澄清它吗?好吧,那就给它起个名字吧!如果它只是一个简短的表达并且它的含义很清楚,我就不会打扰。
请注意,在某些情况下,无论您是否将某些内容定义为命名实体,都可能会影响性能(甚至复杂性)。例如,如果 result_1
是一个不依赖于 v2
的冗长计算,则这样编写是有意义的:
myFunction v1 = \v2 -> statement_1 result_1 $ statement_3..
where result_1 = statement_2
这允许您将函数部分应用到 v1
参数,从而分担通过 v2
进行多次调用的大量计算工作,例如与 map (myFunction v1₀) listOfV2s
。
关于haskell - 函数内的格式化语句 - 规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40147128/