6

作为一项研究实验,我最近致力于实现严格默认的 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打开了,我们也不会评估其他模块中定义的函数的参数。这将使它成为非模块化的。

这里有任何现有技术吗?

4

1 回答 1

5

据我了解,可反驳的模式至少在外部层面上总是很严格。这是另一种说法,经过审查的表达式必须已评估为 WHNF,否则您无法看到它是“Just”还是“Nothing”。

因此你的

!(Just y) -> ...

符号似乎没用。

OTOH,因为在严格的语言中,参数 toJust必须已经被评估,符号

Just !y ->

也没有意义。

于 2013-11-06T13:54:25.917 回答