作为一项研究实验,我最近致力于实现严格的默认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打开,我们也不会评估其他模块中定义的函数的参数.这将使其非模块化.
这里有先前的艺术吗?
据我所知,可改写模式至少在外层是严格的.这是另一种说法,必须将审查的表达式评估为WHNF,否则你无法看到它是'Just'还是'Nothing'.
因此你的
!(Just y) -> ...
Run Code Online (Sandbox Code Playgroud)
符号似乎没用.
OTOH,因为在一种严格的语言中,Just必须已经对该参数进行了评估,即符号
Just !y ->
Run Code Online (Sandbox Code Playgroud)
也没有意义.
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |