【问题标题】:What would pattern matching look like in a strict Haskell?在严格的 Haskell 中,模式匹配会是什么样子?
【发布时间】:2013-11-06 13:49:23
【问题描述】:

作为一项研究实验,我最近致力于实现默认严格的 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`

f x = case x of
  Just !y -> ...  -- now also strict in 'y'

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

一个可能有价值的设计约束是:我希望编译指示是模块化的。例如,即使打开了Strict,我们也不会评估在其他模块中定义的函数的参数。这将使它成为非模块化的。

这里有任何现有技术吗?

【问题讨论】:

  • 我没有现有技术,但根据您对语言的描述,我希望是后者(如果我想要另一个,请写 Just ~y)。
  • case 无论如何都是严格的。
  • 也许你应该换个角度看待它:Just 在其第一个参数中默认是严格的,因此在变量绑定或通配符中大小写是严格还是非严格无关紧要。
  • 在我看来,第一个似乎更合理,因为 Just 是延迟定义的。如果Just 是在Strict 模块中定义的,那么第二个是预期的。
  • @Rhymoid 我并不是说Just 在它的第一个论点中要严格。它是普通的 Haskell Just,在不使用 Strict pragma 的模块中定义。

标签: haskell


【解决方案1】:

据我了解,可反驳的模式总是严格的,至少在外部层面上是如此。这是另一种说法,经过审查的表达式必须已经评估为 WHNF,否则您无法看到它是“Just”还是“Nothing”。

因此你的

!(Just y) -> ...

符号似乎没用。

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

Just !y ->

也没有意义。

【讨论】:

  • 这不是问题。
  • 是的,我会添加一些东西。
  • !(Just x) 是一个不好的例子。我的意思是我们也会在let f x = ... 中评估x。请注意,我并不是在谈论使语言整体上严格,只是在每个模块的基础上。就好像你会对每一个论点和约束力都大加赞赏。问题是刘海有多深。
  • @tibbe 也许您可以使用 ghc cmdline 参数或其他东西来配置深度?我不确定这样的 pragma 会如何根据深度平均影响程序,因此将其作为参数在实验阶段可能会有所帮助。
猜你喜欢
  • 2011-01-14
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2011-03-09
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
相关资源
最近更新 更多