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