gpt4 book ai didi

haskell - 在 let 中使用 Monadic do 表示法,这可能吗?

转载 作者:行者123 更新时间:2023-12-04 17:46:09 24 4
gpt4 key购买 nike

考虑以下有效的 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)))

其中函数 f可以用这样的 do-notation 等效地重写
f :: Maybe (Int, Int)
f = do
a <- Just 3
b <- Just 5
return (a, b)

让我烦恼的是,当我将 f 的内容放入时,do 符号不起作用排队。以下代码甚至不解析:
main :: IO ()
main = do
let x = do
a <- Just 3
b <- Just 5
return (a, b)
print x

我在 let 内部是否正确?我不得不求助于 (>>=) ?

当我这样做时,以下代码也不会解析:
module Main where

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

除了 let 的不必要的有限权力之外,我没有看到明显的原因。 .有没有优雅的使用方式 bind里面 let ?

最佳答案

Am I correct that inside let I am forced to resort to (>>=)?



不:
main :: IO ()
main = do
let x = do
a <- Just 3
b <- Just 5
return (a, b)
print x

Haskell 的 layout规则规定绑定(bind)的主体 ep = e必须至少与 p 的开头一样多。 (或第一个绑定(bind),如果您一次使用多个)。由于 letdo遵循(几乎)与 let … in 相同的规则,您可以使用以下函数验证这一点:
f :: Int
f =
let x =
3 + 5
in x

这不起作用,因为 3 + 5没有与 x 相同或更高的缩进级别.然而,
f :: Int
f =
let x =
3 + 5
in x

作品。此外,虽然 main上面的作品,它并没有真正传达 ab x 中有东西吗的 do block ,所以最好稍微缩进一点:
main :: IO ()
main = do
let x = do
a <- Just 3
b <- Just 5
return (a, b)
print x

关于haskell - 在 let 中使用 Monadic do 表示法,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33963063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com