【发布时间】:2012-05-17 19:40:17
【问题描述】:
我在 Haskell 中创建了很多临时变量:
main = do
let nums'' = [1..10]
let nums' = a . bunch . of_ . functions $ nums''
let nums = another . bunch . of_ . functions $ nums'
print nums
也就是说,我不想像这样写一长串函数:
let nums = another . bunch . of_ . functions . a . bunch . of_ . functions $ [1..10]
因为它对我来说变得不可读,所以我尝试根据它们的作用对函数进行分组。在此过程中,我最终创建了一堆丑陋的临时变量,例如 nums'' 和 nums'(我可以给它们起更有意义的名称,但重点仍然存在……每一个新行都意味着一个新变量)。
在这种情况下,阴影变量会导致代码更清晰。我想做类似的事情:
let nums = [1..10]
nums = a . bunch . of_ . functions $ nums
nums = another . bunch . of_ . functions $ nums
即与上面完全相同,但没有临时变量。在 Haskell 中有什么方法可以做到这一点吗?也许整个事情都可以包装在一个“交易”中:
atomically $ do
(...this code...)
return nums
可以让 Haskell 知道本节中的代码包含阴影变量,它应该只关心最终结果。这可能吗?
【问题讨论】:
-
如果你想传递一个没有变异的值而不创建一堆名字,你也可以使用 State monad
-
我可能会争辩说(a)如果你有有意义的名字来给出中间步骤,那就没有问题; (b) 如果您没有有意义的名称来给出中间步骤,那么分解它们没有任何好处。从(a)和(b)我们可以得出没有问题的结论。当然,这取决于您是否接受前提。
-
我不同意为不同目的重复使用相同的名称必然会使其更具可读性。现在读者必须弄清楚每次出现引用哪个变量绑定。
-
我不认为阴影可以避免创建临时变量。相反,您正在创建相同数量的临时变量,它们都具有相同的名称,这似乎是概念复杂性的增加,而不是减少。我还会查看一系列较小的变化,例如
nums、nums'、nums''或nums1、nums2、nums3等,因为没有 内容 在任何名称中,但您至少可以引用它们中的任何一个,这与一系列阴影变量不同。
标签: haskell syntax composition