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

标签 haskell

考虑:

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/

相关文章:

Haskell - 不明确的类型变量

haskell - monad 内的执行顺序

Haskell 到 Javascript 编译器?

函数返回与函数参数中的 Haskell 模式匹配

haskell - 用于显示类型类函数特化的 GHCi 语法

用 Haskell 解析形式逻辑

haskell - 从标准输入到进程的管道

haskell - 寻找有助于测试 Haskell 实现的标准一致性的资源

haskell - 这种类型有什么一般结构?

haskell - Haskell 中的表达式评估 : Fixing the type of a sub-expression causes parent expression to be evaluated to different degrees