使用名称阴影避免临时变量

Vla*_*ala 6 syntax haskell composition

我在Haskell中创建了很多临时变量:

main = do
    let nums'' = [1..10]
    let nums' = a . bunch . of_ . functions $ nums''
    let nums = another . bunch . of_ . functions $ nums'
    print nums
Run Code Online (Sandbox Code Playgroud)

也就是说,我不想写这么长的函数链:

let nums = another . bunch . of_ . functions . a . bunch . of_ . functions $ [1..10]
Run Code Online (Sandbox Code Playgroud)

因为它对我来说变得难以理解,所以我尝试根据它们的作用对功能进行分组.在这个过程中,我最终创建了一堆丑陋的临时变量,例如nums''nums'(我可以给它们更有意义的名称,但这一点仍然有效......每一条新行都意味着一个新的变量).这是一个阴影变量会导致更清晰的代码的情况.我想做点什么:

let nums = [1..10]
nums = a . bunch . of_ . functions $ nums
nums = another . bunch . of_ . functions $ nums
Run Code Online (Sandbox Code Playgroud)

即与上面完全相同但没有临时变量.在Haskell有什么办法吗?也许整个事情可以包含在"交易"中:

atomically $ do
  (...this code...)
  return nums
Run Code Online (Sandbox Code Playgroud)

让Haskell知道本节中的代码包含阴影变量的东西,它应该只关心最终结果.这可能吗?

Don*_*art 12

这种风格很常见:

let nums = another
         . bunch
         . of_
         . functions
         . a
         . bunch
         . of_
         . functions
         $ [1..10]
Run Code Online (Sandbox Code Playgroud)

它清楚地描述了代码; 同时.提供临时变量名的位置.

它避免了当你开始隐藏变量名时可能发生的危险问题 - 意外地提到错误x会让你迟早遇到麻烦.


Dan*_*ner 9

以下是我不时给出的建议:您可能喜欢命名您的功能而不是命名您的值!例如,也许您可​​能会写:

let runningSum = a . bunch . of_ . functions
    weight     = another . bunch . of_ . functions
in weight . runningSum $ [1..10]
Run Code Online (Sandbox Code Playgroud)


luq*_*qui 6

因为你们的名字(nums,nums',nums'',...)传达分组没有信息,你可以只使用换行符组的功能和沟通同样的事情:

main =
    let nums = a . bunch . of_ . functions
             . another . bunch . of_ . functions
             $ [1..10]
    in print nums
Run Code Online (Sandbox Code Playgroud)

但是,我建议您不要这样做,而是给出传递信息的子计算名称,例如.normalizedNums,average等再有就是因为你使用不同的名称没有丑陋的阴影问题.


aug*_*tss 5

如果你绝对必须,这是可能的,但不是惯用的.请使用Don或luqui建议的内容.

main = do
    nums <- return [1..10]
    nums <- return $ a . bunch . of_ . functions $ nums
    nums <- return $ another . bunch . of_ . functions $ nums
    print nums
Run Code Online (Sandbox Code Playgroud)

如果你不是monad,你总是可以在身份monad中启动一个新的do块.