繁体   English   中英

我可以在Haskell上使用let in guard吗?

[英]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 declsdecls定义的名称引入环境。

对于你的情况,我们可以写

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 ,而不是resultotherConditionotherResult

(这可以通过使用模式警卫得到改善,但不完全: z仍然不可用在otherConditionotherResult

解决方案是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 /= 3mul /= 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM