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?
我是否纠正了
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的布局规则指明的结合体e在p = e万亩意至少不亚于年初p(或第一结合,如果你使用多一次).由于let在do如下(几乎)相同的规则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上述作品,它并没有真正传达a和b事情中x的do块,所以这是一个更好一点,以稍微缩进他们:
main :: IO ()
main = do
let x = do
a <- Just 3
b <- Just 5
return (a, b)
print x
Run Code Online (Sandbox Code Playgroud)