【发布时间】:2013-11-06 13:49:23
【问题描述】:
作为一项研究实验,我最近致力于实现默认严格的 Haskell 模块。我们不是默认懒惰并使用! 作为逃生舱口,而是默认严格并拥有~ 作为逃生舱口。使用{-# LANGUAGE Strict #-} pragma 启用此行为。
在致力于使模式严格的过程中,我遇到了一个有趣的问题:模式应该只在“顶级”中严格还是在所有绑定变量中都严格。例如,如果我们有
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'
(请注意,我们在这里使用的是普通的懒惰 Haskell Just。)
一个可能有价值的设计约束是:我希望编译指示是模块化的。例如,即使打开了Strict,我们也不会评估在其他模块中定义的函数的参数。这将使它成为非模块化的。
这里有任何现有技术吗?
【问题讨论】:
-
我没有现有技术,但根据您对语言的描述,我希望是后者(如果我想要另一个,请写
Just ~y)。 -
case无论如何都是严格的。 -
也许你应该换个角度看待它:
Just在其第一个参数中默认是严格的,因此在变量绑定或通配符中大小写是严格还是非严格无关紧要。 -
在我看来,第一个似乎更合理,因为
Just是延迟定义的。如果Just是在Strict模块中定义的,那么第二个是预期的。 -
@Rhymoid 我并不是说
Just在它的第一个论点中要严格。它是普通的 HaskellJust,在不使用Strictpragma 的模块中定义。
标签: haskell