在严格的Haskell中,模式匹配是什么样子的?
作为一项研究实验,我最近致力于实现默认严格的Haskell模块。而不是默认的懒惰和拥有在严格的Haskell中,模式匹配是什么样子的?,haskell,Haskell,作为一项研究实验,我最近致力于实现默认严格的Haskell模块。而不是默认的懒惰和拥有作为转义图案填充,默认情况下我们是严格的,~作为转义图案填充。使用{-#LANGUAGE Strict}pragma启用此行为 在使模式严格化的过程中,我提出了一个有趣的问题:模式应该只在“顶级”中严格还是在所有绑定变量中严格。例如,如果我们有 f x = case x of y -> ... 我们将强制y,即使Haskell不会这样做。更棘手的情况是 f x = case x of Just
代码>作为转义图案填充,默认情况下我们是严格的,~
作为转义图案填充。使用{-#LANGUAGE Strict}
pragma启用此行为
在使模式严格化的过程中,我提出了一个有趣的问题:模式应该只在“顶级”中严格还是在所有绑定变量中严格。例如,如果我们有
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`
或
(请注意,我们在这里使用的是普通的、懒惰的HaskellJust
)
一个可能有价值的设计约束是:我希望pragma是模块化的。例如,即使启用了Strict
,我们也不会对其他模块中定义的函数的参数求值。这将使它成为非模块化的
这里有任何现有技术吗?据我所知,可反驳的模式至少在外部层面上是严格的。这是另一种说法,即经过仔细检查的表达式必须已对WHNF求值,否则您无法看到它是“Just”还是“Nothing”
因此你
!(Just y) -> ...
符号似乎没用
OTOH,因为在严格的语言中,Just
的参数必须已经计算过了,符号
Just !y ->
也没有意义。我没有现有技术,但从您对该语言的描述来看,我希望使用后者(如果我想使用另一种语言,请编写Just~y
。case
无论哪种方式都是严格的。也许您应该换一种看法:Just
在第一个参数中默认是严格的,因此,在变量绑定或通配符中,大小写是严格的还是非严格的并不重要。在我看来,第一个似乎更合理,因为只是是惰性定义的。如果Just
是在Strict
模块中定义的,那么第二个参数应该是严格的。@Rhymoid我不是说Just
在第一个参数中是严格的。这是正常的Haskell只是
,在一个不使用严格的
杂注的模块中定义。这不是问题。是的,我要添加一些东西。!(仅x)
是一个糟糕的例子。我想说的是,我们将在let f x=…
中计算x
。注意,我并不是说让语言总体上严格,只是在每个模块的基础上严格。就好像你对每一个论点和约束都施加了冲击。问题是刘海的深度有多深。@tibbe也许您可以使用ghc cmdline参数或其他什么来配置深度?我不确定这样一个pragma平均会对程序产生怎样的影响,这取决于深度,所以在实验阶段将其作为一个参数可能会有所帮助。
Just !y ->