作为一项研究实验,我最近致力于实现严格的默认Haskell模块。我们不是默认懒惰而是以!
作为逃生舱,而是默认严格,并以~
作为逃生舱。使用{-# LANGUAGE Strict #-}
编译指示启用此行为。
在努力使模式严格的时候,我提出了一个有趣的问题:模式应该只在“顶级”或所有绑定变量中都是严格的。例如,如果我们有
f x = case x of
y -> ...
即使Haskell不这样做,我们也会强制y
。更棘手的案例是
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
。)
可能有价值的一个设计约束是:我希望pragma是模块化的。例如,即使启用了Strict
,我们也不会评估其他模块中定义的函数的参数。这将使其非模块化。
这里有先前的艺术吗?
答案 0 :(得分:5)
据我所知,可改写模式至少在外层是严格的。这是另一种说法,必须将审查的表达式评估为WHNF,否则你无法看到它是'Just'还是'Nothing'。
因此你的
!(Just y) -> ...
符号似乎毫无用处。
OTOH,因为在严格的语言中,Just
的论证必须已经被评估,符号
Just !y ->
也没有意义。