小编Eco*_*ium的帖子

了解何时使用let和< -

我一直在玩Haskell一段时间,但我还没有完全掌握如何使用在Monad中运行的第三方功能.每次我回去阅读有关Monads等的文章时,我都会有很好的理解,但是当涉及到将它们应用于真实世界的代码时,我无法理解为什么一段代码不起作用.我求助于试验和错误,通常让它编译,但我觉得我应该能够第一次正确使用它们而不试图通过我的启发式更改(尝试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
Run Code Online (Sandbox Code Playgroud)

上面的代码编译.我有目的地遗漏了类型声明,因为我认为它应该是不能编译的.所以这是我的问题.

我为什么不能这样做res <- runX ...,并返回res呀?

为什么要res在let语句里面而不是绑定行动的结果?据我了解,do x <- a1; a2相当于a1 >>= \x -> a2.你怎么样let x = a1 …

haskell

3
推荐指数
1
解决办法
188
查看次数

`wreq`获取/发布异常处理

我正在使用一些http调用,wreq并希望捕获任何异常并返回一个Either类型.我试过这样的事情,但无法弄清楚如何操纵调用,所以它会打字检查.

 -- exhaustive pattern match omitted here
 safeGetUrl :: URL -> Maybe Login -> Maybe Password -> IO (Either String (Response LBS.ByteString))
 safeGetUrl url (Just login) (Just pass) = do
     let def  = defaults
         opts = def & auth ?~ basicAuth (BS.pack login) (BS.pack pass)
     r <- getWith opts url  `E.catch` handler
     return $ Right r

   where
     handler :: HttpException -> Either String (Response LBS.ByteString)
     handler (StatusCodeException s _ _) = do
          return $ Left $ …
Run Code Online (Sandbox Code Playgroud)

haskell

3
推荐指数
1
解决办法
615
查看次数

如何在Esqueleto查询中使用分组依据和总和

我正在尝试使用Esqueleto的示例查询之一,但无法对其进行编译。唯一的变化是我在没有联接的情况下使用它。

我有一个看起来像这样的表:

sqlite> select * from my_table;
id|category|amount
1|A|1.0
2|A|2.0
3|B|2.0
4|B|8.0
Run Code Online (Sandbox Code Playgroud)

我想这样做:

select category,sum(amount) from my_table group by category;
category|sum(amount)
A|3.0
B|10.0
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

import qualified Database.Esqueleto as E

r <- runDB $
    E.select $ E.from $ \t  -> do
        E.groupBy $ t E.^. MyTableCategory
        let sum' = E.sum_ (t E.^. MyTableAmount)
        E.orderBy [E.desc sum']
        return (t E.^. MyTableCategory, sum' )
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

No instance for (PersistField b0) arising from a use of `E.select'
The type variable `b0' is ambiguous
Possible …
Run Code Online (Sandbox Code Playgroud)

haskell yesod esqueleto

2
推荐指数
1
解决办法
712
查看次数

删除AppEngine Python Env中的HTML标记(相当于Ruby的Sanitize)

我正在寻找一个python模块,它将帮助我摆脱HTML标签,但保留文本值.之前我尝试过BeautifulSoup,我无法弄清楚如何完成这个简单的任务.我尝试搜索可以执行此操作的Python模块,但它们似乎都依赖于其他在AppEngine上运行不正常的库.

下面是Ruby的sanitize库中的示例代码,这就是我在Python中所追求的:

require 'rubygems'
require 'sanitize'

html = '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg" />'

Sanitize.clean(html) # => 'foo'
Run Code Online (Sandbox Code Playgroud)

谢谢你的建议.

-e

python google-app-engine html-sanitizing

1
推荐指数
1
解决办法
1440
查看次数

在没有明确检查成功的情况下链接数据库插入

我试图弄清楚case在将记录插入数据库时是否有办法避免大量语句.

我目前的代码类似于:

mt1 <- runDb $ do
        muid <- insertUnique user
        case muid of 
            Just uid -> do
                let t1 = Table1 {..., user = uid} 
                maid  <- insertUnique t1
                case maid of
                    Just aid -> do 
                        mo <- getBy $ UniqueField "somevalue" 
                        case mo of
                            Just (Entity oid o) -> do
                                mcid <- insertUnique Table2 {..., oid = oid} 
                                case mcid of
                                    Just cid -> do 
                                        mfid <- insertUnique Table3 {..., cid = cid} 
                                        case mfid of …
Run Code Online (Sandbox Code Playgroud)

monads haskell persistent

1
推荐指数
1
解决办法
56
查看次数