使用 where 子句和保护模式匹配时变量不在范围内

Ada*_*ral 2 haskell scope

假设我有这段代码:

data Command = Forward Integer
             | Backwards Integer


doSomething givenCommand
 | Forward value <- givenCommand = undefined
 where calculatedValue = sqrt value
Run Code Online (Sandbox Code Playgroud)

假设使用 的未定义行将calculatedValue非常长并且calculatedValue计算时间也更长,因此为了使代码更具可读性,我想使用 where 子句。

问题是value在保护模式匹配中指定的变量不在 where 子句的范围内。
有没有办法解决这个问题,这不会强迫我在警戒线上执行计算?

谢谢。

Wil*_*sem 5

value确实不在范围内,where因为并不是说给定的模式防护会“触发”。如果模式失败,则没有value,因此没有多大意义。

您可以let … in …在此处使用子句:

doSomething givenCommand
    | Forward value <- givenCommand = let calculatedValue = sqrt value in undefined
    | … = …
Run Code Online (Sandbox Code Playgroud)

但是,您在这里不需要模式保护,您可以在doSomething函数的头部进行模式匹配:

doSomething (Forward value) = undefined
    where calculatedValue = sqrt value
doSomething (…) = …
Run Code Online (Sandbox Code Playgroud)