x = do
first <- "mfwew"
let q = first
a <- q
let b = a
putStrLn (b)
return b
如何将指定的变量“first”用于&lt; -q?
谢谢
我想做这样的事情
do
b <- func a
c <- func1 b
func2 c
但这不起作用。我知道它因为IO类型不匹配,但还有其他方法吗? 具体来说,我想在x&lt; - xxx b。
中再次使用b答案 0 :(得分:3)
如果我正确阅读了您的问题和评论,而不是只想使用func a
中的func1 ..
的值而您尝试了强制性的do
- 但是然后注意到这只适用于(IO
) - Monad(s)。
在这种情况下,let
非常接近:
myResult a =
let b = func a
c = func1 b
in func2 c
但是在Haskell中我们通常用组合来代替它:
myResult a = func2 (func1 (func a))
是
myResult a = func2 . func1 . func $ a
最后你可以放弃点 a
来获得无点风格的:
myResult = func2 . func1 . func
如果你喜欢
答案 1 :(得分:2)
拇指规则是,你必须查看你的功能类型。
当函数返回IO
(或您正在使用的任何monad)时,使用<-
运行monadic操作,如代码中所示
do
b <- func a
c <- func1 b
func2 c
当函数只返回一个值而不将其包装在monad中时,请使用let
。
do -- do is not really necessary here... but let's play along
let b = func a
let c = func1 b
func2 c
通常你需要混合两者。例如,如果func
是monadic而func2
不是,我们写
do
b <- func a
let c = func1 b
func2 c
总结:检查你的功能类型。