Haskell 了解何时使用let和<-

Haskell 了解何时使用let和<-,haskell,Haskell,我已经和Haskell玩了一段时间了,但我还没有完全掌握如何使用Monad中运行的第三方函数。每次我回头阅读有关monad等的文章时,我都会有一个很好的理解,但当涉及到将它们应用于实际代码时,我无法理解为什么一段代码不起作用。我采用了反复试验的方法,通常都会将其编译出来,但我觉得我应该能够在第一次正确地使用它们,而不必尝试进行我的启发式更改(尝试let,快速回答,让它不运行任何东西,它只是使lhs成为rhs的同义词 您实际上需要在do中使用一元函数来执行计算 main = do

我已经和Haskell玩了一段时间了,但我还没有完全掌握如何使用Monad中运行的第三方函数。每次我回头阅读有关monad等的文章时,我都会有一个很好的理解,但当涉及到将它们应用于实际代码时,我无法理解为什么一段代码不起作用。我采用了反复试验的方法,通常都会将其编译出来,但我觉得我应该能够在第一次正确地使用它们,而不必尝试进行我的启发式更改(尝试
let,快速回答,让它不运行任何东西,它只是使lhs成为rhs的同义词

您实际上需要在do中使用一元函数来执行计算

  main = do 
     let func = print "I need to be called"
     print "I don't need to be called"
     func
产出:

  "I don't need to be called"
  "I need to be called"
因此,代码中的
res
不是一个值,而是一个一元动作/函数

请记住,
=
,并且在rhs上需要一个
a->m b


我们没有要求。

在您的代码中,
res
是一个
IO[String]
。我毫不怀疑您最初通过GHCi获得了
[String]
,但我相信您已经用

>>> res <- runX $ doc >>> css "strong" /> getText
>>> :t res
res :: [String]
这严格等同于使用
liftM
(或
fmap
):


要在Hawage中搜索特定函数,请尝试使用Hayoo:它也支持通过签名进行搜索。谢谢,@DanielDíazCarrete,当我在Hayoo中执行
hxt getText
时,我立即找到了该函数!getText的返回类型是
XmlTree字符串
。我看到
runX
有这种类型
IOSArrow-XmlTree c->IO[c]
。我现在明白我是如何得到一个IO[String]的了。
让x=a1…
很像
(\x->…)a1
,而不是
你甚至可以不用
res
,只需将
runX$doc>>css设置为“strong”/>getText
在let绑定之后。谢谢!
res
不是一个值,但一个操作是我遗漏的线索。我将用我的新功能更新我的帖子,这样其他人也可以从中受益。谢谢你并投了赞成票。我接受了@MdxBhmt的答案,但你也回答了我的问题。我想这就是在一个线程。你对我在GHCi中所做的是正确的,现在我明白了为什么我得到了不同的结果。
  "I don't need to be called"
  "I need to be called"
>>> res <- runX $ doc >>> css "strong" /> getText
>>> :t res
res :: [String]
res <- runX $ doc >>> css "strong" /> getText
return $ rmSpaceAndBang res
liftM rmSpaceAndBang $ doc >>> css "strong" /> getText