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

Variable not in scope when using where clause and guard pattern matching

假设我有这段代码:

data Command = Forward Integer
             | Backwards Integer


doSomething givenCommand
 | Forward value <- givenCommand = undefined
 where calculatedValue = sqrt value

假设使用 calculatedValueundefined 行将非常长,而 calculatedValue 计算也更长,所以为了使代码更具可读性,我想使用 where 子句。

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

谢谢。

value 确实不在 where 的范围内,因为没有说给定的模式守卫会“开火”。如果模式失败,则没有 value,因此没有多大意义。

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

doSomething givenCommand
    | Forward value <- givenCommand = let calculatedValue = sqrt value in undefined
    | … = …

然而你在这里不需要模式守卫,你可以在 doSomething 函数的头部进行模式匹配:

doSomething (Forward value) = undefined
    where calculatedValue = sqrt value
doSomething (…) = …