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

tib*_*bbe 6 haskell

作为一项研究实验,我最近致力于实现严格的默认Haskell模块.我们不是默认懒惰而是!作为逃生舱,而是严格违约并且具有~逃生舱口.使用{-# LANGUAGE Strict #-}pragma 启用此行为.

在努力使模式严格的时候,我提出了一个有趣的问题:模式应该只在"顶级"或所有绑定变量中都是严格的.例如,如果我们有

f x = case x of
  y -> ...
Run Code Online (Sandbox Code Playgroud)

y即使Haskell不这样做,我们也会强迫.更棘手的情况是

f x = case x of
  Just y -> ...
Run Code Online (Sandbox Code Playgroud)

我们应该将其解释为

f x = case x of
  Just y -> ...  -- already strict in 'x' but not in `y`
Run Code Online (Sandbox Code Playgroud)

要么

f x = case x of
  Just !y -> ...  -- now also strict in 'y'
Run Code Online (Sandbox Code Playgroud)

(注意我们在Just这里使用普通的,懒惰的Haskell .)

可能有价值的一个设计约束是:我希望pragma是模块化的.例如,即使Strict打开,我们也不会评估其他模块中定义的函数的参数.这将使其非模块化.

这里有先前的艺术吗?

Ing*_*ngo 5

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

因此你的

!(Just y) -> ...
Run Code Online (Sandbox Code Playgroud)

符号似乎没用.

OTOH,因为在一种严格的语言中,Just必须已经对该参数进行了评估,即符号

Just !y ->
Run Code Online (Sandbox Code Playgroud)

也没有意义.