TGTGInsighttelegram intelligenceLIVE / telegram public index
← Hypercube's Channel
Hypercube's Channel avatar

TGINSIGHT POST

Post #80

@SmartHypercube_channel

Hypercube's Channel

Views229帖子阅读量
发布6月26日2022/06/26 07:18
Post content

帖子内容

我好喜欢 Haskell 的这两个特性:各种控制结构都是表达式,并且内部是独立的文法块。(其实 JS 也是这样啦)这两个特性使得变量名和变量的生命期管理非常轻松,配合上编译器的静态检查可以避免很多错误。 在一个已经有些复杂的 Python 函数中,我想把一个常数改成如果满足特定条件,就要在运行时打开一个文件并做一些计算来得到。简单的写法是这样: ... foo = 5 if dynamicFoo: count = 0 for line in open(...).readlines(): type_, n = line.split() if type_ == 'foo': count += int(n) foo = count ... 注意这段代码产生了很多个新变量:count, line, type_, n。任何一个如果在其他地方已经使用了,就会静默地覆盖掉,导致难以发现的错误,没有工具可以对此发出警告。有人可能会说正解是把这一段代码包装成单独的函数,但这就需要为这个只用一次、完全是为这里专用的函数起一个名字并且放在其他地方,导致阅读这段代码时增加几个步骤。 这段代码在 haskell 中可以写成这样: ... foo <- if dynamicFoo then do s <- readFileUtf8 ... values <- for (T.lines s) $ \line -> do case words line of ["foo", n] -> return (read (T.unpack n)) _ -> return 0 return (sum values) else do return 5 ... 除了 foo 以外的变量的作用域都被限制在各自的文法块中,并不会泄漏到外层。如果其他地方已经使用了同名变量,编译器还会对 name shadowing 发出警告。