[英]Can I use let in guards on Haskell?
现在我有一个错误,说输入'|'上的解析错误 指的是'|' 在if语句之前。 我也不确定我是否可以像下面的代码那样使用let in guard。 下面的代码是我的问题的一个例子,请帮助纠正我的错误,提前谢谢!
func x y
| let
sum = x + y
mult = x * y
| if sum == 3
then do
sum+=1
else if mult == 5
then do
mult -=1
实际上,Haskell2010允许let
表达式出现在后卫中。 请在此处查看报告。 |let decls
将decls
定义的名称引入环境。
对于你的情况,我们可以写
fun x y
| let sum = x + y, sum == 3 = Just (sum + 1)
| let mult = x * y, mult == 5 = Just (mult - 1)
| otherwise = Nothing
不幸的是,我们不能做到这一点与let
。
更确切地说,我们可以写
func x y | let z = .. in condition = result
| otherCondition = otherResult
但z
将只在可见的condition
,而不是result
, otherCondition
或otherResult
。
(这可以通过使用模式警卫得到改善,但不完全: z
仍然不可用在otherCondition
和otherResult
)
解决方案是where
使用:
func x y | condition = result
| otherCondition = otherResult
where z = ...
在这里, z
随处可见。
(就个人而言,我不喜欢这种形式where
因为它离z
的使用太远了,但在这种情况下我看不到任何简单的替代方案。)
最后,让我补充一点,你的代码对我来说看起来不起作用: if then
没有函数编程中的else
if then
没有了,而mult -= 1
不能修改变量mult
(对于sum += 1
)。
您可以在顶部使用let
,但必须后跟in
以指定要使用定义值的块。 如果sum /= 3
和mul /= 5
你也错过了该做什么的条件。 所以可能会返回一个Maybe
类型可能会更好,例如
func :: Integral a => a -> a -> Maybe a
func x y = let sum = x + y
mul = x * y
in case (sum, mul) of
(3, _) -> Just (sum + 1)
(_, 5) -> Just (mul - 1)
_ -> Nothing
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.