Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在严格的Haskell中,模式匹配是什么样子的?_Haskell - Fatal编程技术网

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

在严格的Haskell中,模式匹配是什么样子的?,haskell,Haskell,作为一项研究实验,我最近致力于实现默认严格的Haskell模块。而不是默认的懒惰和拥有作为转义图案填充,默认情况下我们是严格的,~作为转义图案填充。使用{-#LANGUAGE Strict}pragma启用此行为 在使模式严格化的过程中,我提出了一个有趣的问题:模式应该只在“顶级”中严格还是在所有绑定变量中严格。例如,如果我们有 f x = case x of y -> ... 我们将强制y,即使Haskell不会这样做。更棘手的情况是 f x = case x of Just

作为一项研究实验,我最近致力于实现默认严格的Haskell模块。而不是默认的懒惰和拥有
作为转义图案填充,默认情况下我们是严格的,
~
作为转义图案填充。使用
{-#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`

(请注意,我们在这里使用的是普通的、懒惰的Haskell
Just

一个可能有价值的设计约束是:我希望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 ->