考虑以下有效的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
内联内容放入行内时,表示法不起作用。以下代码甚至无法解析:
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
?
我是否纠正
let
我被迫诉诸于内政(>>=)
?
不:
main :: IO ()
main = do
let x = do
a <- Just 3
b <- Just 5
return (a, b)
print x
Haskell的布局规则指明的结合体e
在p = e
万亩至少意不亚于年初p
(或第一结合,如果你使用多一次)。由于let
in中do
(几乎)遵循与相同的规则let … in
,因此可以使用以下功能对此进行验证:
f :: Int
f =
let x =
3 + 5
in x
这不起作用,因为3 + 5
缩进级别与相同或更高x
。然而,
f :: Int
f =
let x =
3 + 5
in x
作品。此外,虽然main
上述作品,它并没有真正传达a
和b
在事物x
的do
块,所以这是一个更好一点,以稍微缩进他们:
main :: IO ()
main = do
let x = do
a <- Just 3
b <- Just 5
return (a, b)
print x
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句