Haskell m>>;=回报意味着什么?

Haskell m>>;=回报意味着什么?,haskell,monads,Haskell,Monads,正在阅读有关monads的教程,并坚持以下内容: let m = return 2 :: IO Int 这是可以理解的-我们将2封装在一元变量(IO 2)中 但是下面的意思是什么 m >>= return 它输出2 正如我从Monad定义中所知道的,该返回总是只接受一个参数。然而,这里的论点是不存在的。如何理解它?是绑定操作符。签名如下: (>>=) :: Monad m => m a -> (a -> m b) -> m b 因此它(在左侧

正在阅读有关monads的教程,并坚持以下内容:

let m = return 2 :: IO Int
这是可以理解的-我们将2封装在一元变量(IO 2)中 但是下面的意思是什么

m >>= return
它输出2

正如我从
Monad
定义中所知道的,该返回总是只接受一个参数。然而,这里的论点是不存在的。如何理解它?

是绑定操作符。签名如下:

(>>=) :: Monad m => m a -> (a -> m b) -> m b
因此它(在左侧)需要一个一元对象(例如
ioint
),在右侧需要一个函数
a->mb
(例如
Int->iob

运算符用于将单子中的操作链接在一起。例如,
putStrLn::String->IO()
可以像这样使用:

return "foo" >>= putStrLn
现在我们
返回一个字符串
“foo”
。bind操作符将把它从IO monad中解包出来,并将它传递给
putStrLn
函数,该函数将
“foo”
打印到标准输出通道,并返回一个
IO()
。然后,我们可以使用该
IO()
进行进一步处理

由于
return
将数据包装到monad中,因此编写
>>=return
基本上是无用的。因为对于所有
x
x>>=return
应该等于
x

return
的参数并不缺少,因为
>=
将使用参数调用return。你也可以写:

m >>= (\x -> return x)
但是这相当于
m>=return

是绑定操作符。签名如下:

(>>=) :: Monad m => m a -> (a -> m b) -> m b
因此它(在左侧)需要一个一元对象(例如
ioint
),在右侧需要一个函数
a->mb
(例如
Int->iob

运算符用于将单子中的操作链接在一起。例如,
putStrLn::String->IO()
可以像这样使用:

return "foo" >>= putStrLn
现在我们
返回一个字符串
“foo”
。bind操作符将把它从IO monad中解包出来,并将它传递给
putStrLn
函数,该函数将
“foo”
打印到标准输出通道,并返回一个
IO()
。然后,我们可以使用该
IO()
进行进一步处理

由于
return
将数据包装到monad中,因此编写
>>=return
基本上是无用的。因为对于所有
x
x>>=return
应该等于
x

return
的参数并不缺少,因为
>=
将使用参数调用return。你也可以写:

m >>= (\x -> return x)

但是这相当于
m>=return

m>=return
相当于
m
return
(\x->return x)
是相同的
m>=(\x->return x)
do{x
m>=return
相当于
m
return
(\x->return x)
相同。
m>=(\x->return x)
do相同{x如果putStrLn只接受字符串而不接受IO作为输入参数,它怎么能返回IO?(putStrLn::String->IO())@BulatM.:因为
=
操作符打开
IO
中的值。请注意,在类型签名中,它不是
MA->(MA->MB)->MB
,而是
MA->(a->MB)->MB
。因此,通过“return”返回IO,并返回IO(除了字符串)putStrLn是两个不同的对象吗?@BulatM。不,它们不是对象,甚至不是类型;
IO
IO
是相同的-它是一个标记,一个与另一种类型(如
IO String
IO Int
)一起的标记,以形成“事物”可以具有的类型。这就是为什么
IO
被称为“类型构造函数”。现在,
return 1::IO Int
意味着
return 1
是类型为
IO Int
的Haskell表达式。这反过来意味着拥有
x和另一个I/O“语言原语“,
getLine::IO String
意味着,如果putStrLn只接受字符串而不接受IO作为输入参数,那么它如何返回IO?(putStrLn::String->IO())@BulatM.:因为
>=
操作符打开
IO
中的值。请注意,在类型签名中,它不是
ma->(ma->mb)->mb
,它是
ma->(a->mb)->mb
。因此通过“return”返回IO,并返回IO(除了字符串)putStrLn是两个不同的对象吗?@BulatM。不,它们不是对象,甚至不是类型;
IO
IO
是相同的-它是一个标记,一个与另一种类型(如
IO String
IO Int
)一起的标记,以形成“事物”可以具有的类型。这就是为什么
IO
被称为“类型构造函数”。现在,
return 1::IO Int
意味着
return 1
是类型为
IO Int
的Haskell表达式。这反过来意味着,拥有
x和另一个I/O“语言”原语,
getLine::IO String
意味着拥有
s