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

Haskell 函数中的格式化语句-规则?,haskell,Haskell,考虑: myFunction :: (Eq a) => a -> a -> [a] myFunction v1 v2 = statement_1.. $ statement_2... $ statement_3... vs 在Haskell中,哪种格式是首选的,是否有经验法则?关于何时使用每个版本,是否有特定的规则 首先,它们实际上并不等同f$x$y被解析为f$(x$y)(因为infixr 0$),因此您实际上需要将第一个版本编写为 myFunction v1 v2 = (s

考虑:

myFunction :: (Eq a) => a -> a -> [a]
myFunction v1 v2 = statement_1.. $ statement_2... $ statement_3...
vs


在Haskell中,哪种格式是首选的,是否有经验法则?关于何时使用每个版本,是否有特定的规则

首先,它们实际上并不等同
f$x$y
被解析为
f$(x$y)
(因为
infixr 0$
),因此您实际上需要将第一个版本编写为

myFunction v1 v2 = (statement_1.. $ statement_2...) $ statement_3...
或者,如果
statement\u 1
实际上只是一个符号,我更喜欢它

myFunction v1 v2 = statement_1 (statement_2...) (statement_3...)
实际上,您的问题是,为这些中间结果命名是否有意义。这是一个与Haskell关系不大的问题——它可以应用于大多数编程语言,尽管很少有人能像Haskell那样在单个表达式中编写那么多的代码。答案只能是:如果代码更容易理解,就给他们起名字。也许很难看出
语句\u 2…
应该有什么好处,但一句“单词注释”就能澄清这一点吗?那就给它起个名字吧!如果它只是一个简短的表达,而且很清楚它到底是什么意思,我就不麻烦了

请注意,在某些情况下,无论是否将某个对象定义为命名实体,都可能会影响性能(甚至复杂性)。例如,如果
result_1
是一个不依赖于
v2
的冗长计算,则可以这样编写:

myFunction v1 = \v2 -> statement_1 result_1 $ statement_3..
 where result_1 = statement_2

这允许您仅将函数部分应用于
v1
参数,从而为
v2
上的多个调用分担大量计算工作量,例如使用
map(myFunction v1₀) listOfV2s

我认为后者更具可读性。我还用命令式语言编写了许多函数,如果它能立即生成可理解且命名良好的函数的话。但是,这个问题过于基于观点,无法给出好的答案。如果我能为
结果\u I
变量指定有意义的名称,我会使用后者。其他se I倾向于使用第一种形式,可能在多行上,并且经常使用
而不是
$
来表示除最后一种之外的所有形式。只是一个语义说明:Haskell没有可以出现在函数体中的语句,只有表达式。
myFunction v1 = \v2 -> statement_1 result_1 $ statement_3..
 where result_1 = statement_2