作为一项研究实验,我最近致力于实现严格默认的 Haskell 模块。我们不是默认懒惰并具有!
逃生舱口,而是默认严格并具有~
逃生舱口。使用{-# LANGUAGE Strict #-}
编译指示启用此行为。
在努力使模式变得严格时,我遇到了一个有趣的问题:模式应该只在“顶级”中严格还是在所有绑定变量中都严格。例如,如果我们有
f x = case x of
y -> ...
y
即使 Haskell 不会这样做,我们也会强制执行。更棘手的情况是
f x = case x of
Just y -> ...
我们是否应该将其解释为
f x = case x of
Just y -> ... -- already strict in 'x' but not in `y`
或者
f x = case x of
Just !y -> ... -- now also strict in 'y'
(请注意,我们在Just
这里使用的是普通的懒惰的 Haskell。)
一个可能有价值的设计约束是:我希望编译指示是模块化的。例如,即使Strict
打开了,我们也不会评估其他模块中定义的函数的参数。这将使它成为非模块化的。
这里有任何现有技术吗?