格式化函数中的语句 - 规则?

时间:2016-10-20 06:39:03

标签: haskell

考虑:

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中首选哪种格式,是否有经验法则?关于何时使用每个版本,是否有任何具体规则?

1 个答案:

答案 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