haskell 在同一函数的不同模式之间共享变量的惯用方法是什么?

fwzugrvs  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(151)

我开始在用haskell编写代码方面有了一个不错的掌握,并且我注意到我犯过几次错误:

doFoo :: ...
doFoo pattern1 = fooHelper ...
doFoo pattern2 = fooHelper ...
  where
    fooHelper = ...

fooHelper当然不在doFoo pattern1的作用域中。我发现自己纠正了这个错误,方法是使用doFoo的一个不可反驳的模式,然后在函数中使用case表达式进行模式匹配:

doFoo :: ...
doFoo irrefutable = case irrefutable of
  pattern1 -> fooHelper ...
  pattern2 -> fooHelper ...
  where
    fooHelper = ...

fooHelper现在当然在两种模式的范围内。
据我所知,函数级的模式匹配在各个方面都等价于case表达式中的模式匹配(如果我说错了,请纠正我),所以这样做似乎是合理的。这种模式是否被认为是惯用的,或者有更好的(或者只是常用的替代方法)方式?

nle07wnf

nle07wnf1#

我认为在这种情况下,将其转换为case表达式是很常见的。除此之外,使用LambdaCase extension,您可以使其更短一些。

doFoo :: ...
doFoo = \case
  pattern1 -> fooHelper ...
  pattern2 -> fooHelper ...
  where
    fooHelper = ...

从GHC 9.4.1开始,你甚至可以在多个参数上进行模式匹配。

doFoo :: ...
doFoo = \cases
  pattern1 pattern1' -> fooHelper ...
  pattern2 pattern2' -> fooHelper ...
  where
    fooHelper = ...

而不是写

doFoo :: ...
doFoo x y = case (x, y) of
  (pattern1, pattern1') -> fooHelper ...
  (pattern2, pattern2') -> fooHelper ...
  where
    fooHelper = ...

请注意,它是\cases,而不是\case

相关问题