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会让你迟早遇到麻烦.
以下是我不时给出的建议:您可能喜欢命名您的功能而不是命名您的值!例如,也许您可能会写:
let runningSum = a . bunch . of_ . functions
weight = another . bunch . of_ . functions
in weight . runningSum $ [1..10]
Run Code Online (Sandbox Code Playgroud)
因为你们的名字(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等再有就是因为你使用不同的名称没有丑陋的阴影问题.
如果你绝对必须,这是可能的,但不是惯用的.请使用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块.