gpt4 book ai didi

haskell - 了解何时使用 let 和 <-

转载 作者:行者123 更新时间:2023-12-02 21:33:45 25 4
gpt4 key购买 nike

我已经使用 Haskell 有一段时间了,但我还没有完全掌握如何使用在 Monad 中运行的第三方函数。每次我回去阅读有关 Monad 等的文章时,我都会得到很好的理解,但当涉及到将它们应用到现实世界的代码时,我无法弄清楚为什么一段代码不起作用。我会进行反复试验,通常会编译它,但我觉得我应该能够第一次正确使用它们,而无需尝试进行我的启发式更改(尝试 let, <-, liftM, 等)

所以我想根据这个简单的函数问几个问题,它确实做了很多有趣的事情。

import Text.XML.HXT.Core
import Text.HandsomeSoup
import Data.String.Utils

function h = do
let url = myUrlBuilder h
doc = fromUrl url
res = runX $ doc >>> css "strong" /> getText
--nres = liftM rmSpaceAndBang (res)
res

rmSpaceAndBang ps = map (\x-> replace "!" "" (strip x)) ps

上面的代码可以编译。我故意省略了类型声明,因为我认为它应该是的类型声明无法编译。这是我的问题。

为什么我做不到 res <- runX ...并返回res就这样吗?

为什么应该 res位于 let 语句内并且不受操作结果的约束?据我了解,do x <- a1; a2相当于 a1 >>= \x -> a2 。当你 let x = a1 时,这有什么不同? ?

当我使用<-时我收到以下错误,如果不是我的反复试验方法,我将无法弄清楚我需要使用 let在这里。

Couldn't match type `[]' with `IO'
Expected type: IO String
Actual type: [String]

当我专注于res时以上,我的理解不足也适用于其他let函数中的语句也是如此。

如何找到 res 的返回类型?

我无法找到一种方法来搜索 hackage getText (hxt 似乎太大了,无法逐个模块地查看。下次可能会尝试 Google 站点搜索)。最后,我最终在 GHCi 中输入了部分代码,并执行了 :t res 。它告诉我这是[String] 。有一个更好的方法吗?

由于 res 的类型为 [String]我想我会放 [String]作为我的函数的返回类型。但 GHC 说应该是 IO [String] (编译)。为什么:t先给我错误的信息?

当函数返回 IO String 时,对它们使用纯函数的最佳方法是什么?

现在我被困在里面IO [String]我需要在进行字符串操作的任何地方使用来提升。有更好的方法吗?

希望我能从中学到足够的东西,以便我能够使用正确的语法,而不必盲目地尝试一些组合。

更新:

我错过的关键部分是事实 res不是一种值(value)观,而是一种行动。所以我有两种选择:一种是我上面的代码 let res =但最后调用它,另一个是做 res <-但然后做 return (res)

使用res <-的优势是我可以摆脱 liftMres现在是[String] (请参阅下面@duplode 的回答)。

谢谢!

最佳答案

在您的代码中,resIO [String] 。我毫不怀疑你有 [String]起初通过 GHCi,但我相信你用它进行了测试

>>> res <- runX $ doc >>> css "strong" /> getText
>>> :t res
res :: [String]

这与您的代码不等效。不同的是let只是绑定(bind)你的IO [String]操作而不运行它,而 <-do block 运行操作并绑定(bind)结果,在本例中为 [String] .

Now that I am stuck inside IO [String] I need to use to lift everywhere I do string operations. Is there a better way to do this?

在 do block 内,有时这样写会更方便:

res <- runX $ doc >>> css "strong" /> getText
return $ rmSpaceAndBang res

这严格等同于使用 liftM (或fmap):

liftM rmSpaceAndBang $ doc >>> css "strong" /> getText

关于haskell - 了解何时使用 let 和 <-,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22430883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com