考虑:
myFunction :: (Eq a) => a -> a -> [a]
myFunction v1 v2 = statement_1.. $ statement_2... $ statement_3...
VS
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中首选哪种格式,是否有经验法则?关于何时使用每个版本,是否有任何具体规则?
答案 0 :(得分:3)
首先,这些实际上并不等同。 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
。