haskell如何使用以前分配的变量

时间:2016-02-21 06:49:29

标签: haskell haskell-platform

  x = do
    first <- "mfwew"
    let q = first
    a <- q
    let b = a
    putStrLn (b)
    return b

如何将指定的变量“first”用于&lt; -q?

谢谢

我想做这样的事情

    do
      b <- func a
      c <- func1 b
      func2 c

但这不起作用。我知道它因为IO类型不匹配,但还有其他方法吗? 具体来说,我想在x&lt; - xxx b。

中再次使用b

2 个答案:

答案 0 :(得分:3)

如果我正确阅读了您的问题和评论,而不是只想使用func a中的func1 ..而您尝试了强制性的do - 但是然后注意到这只适用于(IO) - Monad(s)。

在这种情况下,let非常接近:

myResult a =
   let b = func a
       c = func1 b
   in func2 c

但是在Haskell中我们通常用组合来代替它:

myResult a = func2 (func1 (func a))

myResult a = func2 . func1 . func $ a

最后你可以放弃 a来获得无点风格的

myResult = func2 . func1 . func

如果你喜欢

答案 1 :(得分:2)

拇指规则是,你必须查看你的功能类型。

当函数返回IO(或您正在使用的任何monad)时,使用<-运行monadic操作,如代码中所示

do
  b <- func a
  c <- func1 b
  func2 c

当函数只返回一个值而不将其包装在monad中时,请使用let

do  -- do is not really necessary here... but let's play along
  let b = func a
  let c = func1 b
  func2 c

通常你需要混合两者。例如,如果func是monadic而func2不是,我们写

do
  b <- func a
  let c = func1 b
  func2 c

总结:检查你的功能类型。