Monadic里面的符号让,有可能吗?

rub*_*oor 5 haskell let do-notation

请考虑以下有效的Haskell代码

module Main where

main :: IO ()
main = do
  let x = f
  print x

f :: Maybe (Int, Int)
f =
  Just 3 >>= (\a ->
    Just 5 >>= (\b ->
      return (a, b)))
Run Code Online (Sandbox Code Playgroud)

其中函数f可以用这样的do-notation等效地重写

f :: Maybe (Int, Int)
f = do
  a <- Just 3
  b <- Just 5
  return (a, b)
Run Code Online (Sandbox Code Playgroud)

什么让我烦恼的是,当我把f内联的内容放进去的时候,这个符号是行不通的.以下代码甚至不解析:

main :: IO ()
main = do
  let x = do
    a <- Just 3
    b <- Just 5
    return (a, b)
  print x
Run Code Online (Sandbox Code Playgroud)

我是否纠正了let我被迫诉诸的内部(>>=)

虽然我正在使用它,但以下代码无法解析:

module Main where

main :: IO ()
main = do
  let x =
    Just 3 >>= (\a ->
      Just 5 >>= (\b ->
        return (a, b)))
  print x
Run Code Online (Sandbox Code Playgroud)

除了不必要的有限的力量之外,我没有看到明显的原因let.有没有办法使用一种优雅的方式bind里面let

Zet*_*eta 8

我是否纠正了let我被迫诉诸的内部(>>=)

没有:

main :: IO ()
main = do
  let x = do
      a <- Just 3
      b <- Just 5
      return (a, b)
  print x
Run Code Online (Sandbox Code Playgroud)

Haskell的布局规则指明的结合体ep = e万亩意至少不亚于年初p(或第一结合,如果你使用多一次).由于letdo如下(几乎)相同的规则let … in,你可以用下面的函数验证这一点:

f :: Int
f = 
  let x =
    3 + 5
  in x
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为3 + 5没有相同或更大的缩进级别x.然而,

f :: Int
f =
  let x =
       3 + 5
  in x
Run Code Online (Sandbox Code Playgroud)

作品.此外,虽然main上述作品,它并没有真正传达ab事情中xdo块,所以这是一个更好一点,以稍微缩进他们:

main :: IO ()
main = do
  let x = do
        a <- Just 3
        b <- Just 5
        return (a, b)
  print x
Run Code Online (Sandbox Code Playgroud)