使用 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
假设使用 calculatedValue
的 undefined 行将非常长,而 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 (…) = …
假设我有这段代码:
data Command = Forward Integer
| Backwards Integer
doSomething givenCommand
| Forward value <- givenCommand = undefined
where calculatedValue = sqrt value
假设使用 calculatedValue
的 undefined 行将非常长,而 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 (…) = …