Haskell m>>;=回报意味着什么?
正在阅读有关monads的教程,并坚持以下内容: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 因此它(在左侧
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{xm>=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