在严格的Haskell中,模式匹配会是什么样的?

时间:2013-11-06 13:49:23

标签: haskell

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

这里有先前的艺术吗?

1 个答案:

答案 0 :(得分:5)

据我所知,可改写模式至少在外层是严格的。这是另一种说法,必须将审查的表达式评估为WHNF,否则你无法看到它是'Just'还是'Nothing'。

因此你的

!(Just y) -> ...

符号似乎毫无用处。

OTOH,因为在严格的语言中,Just的论证必须已经被评估,符号

Just !y ->

也没有意义。