小编Reh*_*que的帖子

将python'type'对象转换为字符串

我想知道如何使用python的反射功能将python'type'对象转换为字符串.

例如,我想打印一个对象的类型

print "My type is " + type(someObject) # (which obviously doesn't work like this)
Run Code Online (Sandbox Code Playgroud)

编辑:顺便说一句,谢谢大家,我只是寻找简单的打印类型的控制台输出目的,没有什么花哨的.加比的type(someObject).__name__作品很好:)

python reflection

127
推荐指数
4
解决办法
12万
查看次数

如何在Haskell(ghc)中编写与平台无关的代码

我想在Hackage中使用一些特定于平台的库(例如inotify,kqueue).但是,有关如何使用条件编译在平台之间切换的文档似乎有点稀疏.我在查找相关文档时遇到了一些麻烦......

  1. 我可以使用哪些预处理器定义在平台之间切换?

  2. 如何设置我的cabal文件分别在linux/osx上包含/排除inotify/kqueue?

我希望在此处记录它可能对其他人也有用,所以提及其他常见平台可能是值得的.到处寻找这些东西真是太傻了.

haskell platform-specific platform-independent

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

在Yesod中允许跨源请求

我的应用程序使用bookmarklet,我需要允许CORS,MyRouteR因此我的bookmarklet代码可以使用此路由进行AJAX请求.

在我的配置/路由初稿中,我MyRouteR只支持一种请求方法PUT.但事实证明,我还需要支持OPTIONS方法,这些浏览器用于CORS预检请求.

我在config/routes中得到了以下结果:

/myroute MyRouteR PUT OPTIONS
Run Code Online (Sandbox Code Playgroud)

我有点希望在模板Haskell中有一些相关的机制来处理配置/路由,这样在这个路由的方法列表中添加OPTIONS会自动导致CORS支持,但没有骰子.不是世界末日,但它会有意义并且感觉优雅.

为了使CORS工作,我给路由一个OPTIONS处理程序:

optionsMyRouteR :: Handler RepPlain
optionsMyRouteR = do
    addHeader "Access-Control-Allow-Origin" "*"
    addHeader "Access-Control-Allow-Methods" "PUT, OPTIONS"
    return $ RepPlain $ toContent ("" :: Text)

putMyRouteR :: Handler RepJson
putMyRouteR = do
    addHeader "Access-Control-Allow-Origin" "*"
    -- more stuff ...
Run Code Online (Sandbox Code Playgroud)

这是有效的,但感觉有点不太正常,因为它是如此的样板.那么,有两个问题:

  1. 我们有比Yesodic更好的形容词吗?
  2. 还有另一种更好的方法让路由支持跨源请求吗?

ajax haskell bookmarklet cors yesod

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

Haskell中的引用透明度和mmap

我希望一起使用System.INotifySystem.IO.MMap来监视文件修改,然后快速执行差异以通过网络发送补丁.但是,在System.IO.MMap的文档中,有一些关于引用透明性的警告:

文件说明

如果您知道自己是唯一的用户,那么mmap文件是安全的.否则参考透明度可能会或可能不会受到影响.遗憾的是,语义在操作系统之间存在很大差异.

MMap返回的值,IO ByteString当我使用这个值时,putStr我每次都期望得到不同的结果吗?我假设作者意味着值可能会在IO操作期间发生变化,例如putStr崩溃?

编辑开始:想想看,我想这个问题的答案有点明显......如果在取消装箱后任何时候价值发生变化都会有问题.

do 
  v <- mappedValue :: IO ByteString
  putStr v
  putStr v  -- Expects the same value of v everywhere
Run Code Online (Sandbox Code Playgroud)

END-OF-EDIT

难道不可能在映射区域或文件上获得某种锁定吗?

或者,是否可以编写一个copy :: IO ByteString -> IO ByteString以安全的方式获取当前状态文件快照的函数?

io file-io haskell mmap virtual-memory

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

如何在Yesod中进行(基于角色的)访问控制?

我想知道Handler在Yesod中为用户/权限或资源添加角色的最佳方法是什么.有没有人有这种东西的先前艺术?是否有任何方法利用类型系统来帮助防止漏洞(并且还要保持数据库查询以检查所有权等)?

编辑:很抱歉错过了这个 - 我确实注意到实际上有一个部分,我乍一看(我认为因为没有提及访问/角色/权限),在Yesod书中的授权.这似乎在路由器级别使用PUT/POST的写标志进行访问控制.它本身看起来并不十分复杂,但它看起来很适合在顶部构建抽象...

haskell authorization access-control rbac yesod

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

升级安装在cabal沙箱中的软件包

我在理解如何升级cabal沙箱中的软件包时遇到了一些麻烦.我想升级esqueleto-1.3.4.5esqueleto-1.3.5并改变我myapp.cabal的依赖esqueleto >= 1.3.5 && < 1.4.

$ cabal --version cabal-install version 1.18.0.2 using version 1.18.1.2 of the Cabal library $ cabal install --upgrade-dependencies Resolving dependencies... cabal: Could not resolve dependencies: trying: esqueleto-1.3.4.5/installed-ac7... (user goal) next goal: myapp (user goal) rejecting: myapp-0.0.0 (conflict: esqueleto==1.3.4.5/installed-ac7..., myapp => esqueleto>=1.3.5 && <1.4)

错误在我看来好像cabal正在尝试使用已安装的esqueleto版本来解决依赖关系,esqueleto-1.3.4.5/installed-ac7...有人可以解释一下这是如何工作的吗?

我的直觉是,我应该使用--upgrade-dependencies这样做,但我也尝试过--only-dependencies--reinstall.

haskell cabal cabal-dev

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

使用组合器将导管重新组装成更大的块

我正在尝试构造一个Conduit接收为输入ByteStrings(每个块大小约1kb)并生成ByteString512kb块的输出连接.

这看起来应该很简单,但是我遇到了很多麻烦,我尝试过的大多数策略只能成功地将块分成更小的块,我没有成功连接更大的块.

我开始尝试isolate,然后takeExactlyE最终conduitVector,但无济于事.最终我决定这个:

import qualified Data.Conduit               as C
import qualified Data.Conduit.Combinators   as C
import qualified Data.ByteString            as B
import qualified Data.ByteString.Lazy       as BL

chunksOfAtLeast :: Monad m => Int -> C.Conduit B.ByteString m BL.ByteString
chunksOfAtLeast chunkSize = loop BL.empty chunkSize
  where 
    loop buffer n = do
      mchunk <- C.await
      case mchunk of 
        Nothing -> 
          -- Yield last remaining bytes
          when (n < chunkSize) (C.yield buffer)
        Just chunk -> …
Run Code Online (Sandbox Code Playgroud)

haskell chunking conduit

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

通过平铺三角形来细分任意多边形

我需要使用近似均匀的三角形平铺来填充任意多边形.我该怎么做?您可以提供对现有算法的引用,甚至可以提供您自己的想法或提示.

推测如下:

  • 多边形可能是凸的(但如果你想出一个适用于凹形的算法,可以获得奖励积分)
  • 多边形具有任意数量的边(3个或更多)
  • 曲面细分量(最好是算法添加的顶点数)应该是参数化的
  • 可以通过算法划分多边形的边缘
  • 三角形的大小和形状应该几乎一致(即角落倾向于60度)
  • 优选地,顶点处的数量边缘应该是很少而不是很多.这可能是从前一点开始的(即算法应该产生"干净的网格").

这不是一个容易解决的问题,我希望"启发式"解决方案可能是最有效的......(对吧?)

language-agnostic algorithm graphics topology tesselation

8
推荐指数
2
解决办法
3862
查看次数

在haskell的FFI后面使用stdout/stderr/stdin流

我正在开发一个小的haskell程序,它使用我用C++开发的外部静态库.它通过ghc的FFI(外部函数接口)访问lib.在这个库里面我想对控制台做一些输出.但是,它看起来像c ++方面的东西没有正确的stdout句柄,因为输出没有出现在控制台上.那么,我的问题是:

  • ghc是否劫持了这三个流(stdout,stdin,stderr)或libstdc ++只是没有初始化它们因为我正在与ghc链接?
  • 如果写入stdout,我的FFI导入是否需要"安全"?
  • 如何将stdout传递给C函数?我应该直接传递它还是需要C型?

附加说明:我将libstdc ++直接链接到可执行文件(即ghc -lstdc ++ ...),我天真地认为这是正确的方法.似乎运作良好

免责声明:对于Haskell来说还是一个新手,所以宝贝现在迈出了步伐; P

c++ io haskell ffi ghc

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

使 attoparsec 解析器递归

我一直在编写 attoparsec 解析器,并且一直在尝试将解析器转换为递归解析器的模式(将它们与 monad bind >>= 运算符递归组合)。

所以我创建了一个函数来将解析器变成递归解析器,如下所示:

recursiveParser :: (a -> A.Parser a) -> a -> A.Parser a
recursiveParser parser a = (parser a >>= recursiveParser parser) <|> return a
Run Code Online (Sandbox Code Playgroud)

如果您有递归数据类型,这很有用

data Expression = ConsExpr Expression Expression | EmptyExpr

parseRHS :: Expression -> Parser Expression
parseRHS e = ConsExpr e <$> parseFoo

parseExpression :: Parser Expression
parseExpression = parseLHS >>= recursiveParser parseRHS
  where parseLHS = parseRHS EmptyExpr
Run Code Online (Sandbox Code Playgroud)

有没有更惯用的解决方案?几乎看起来recursiveParser应该是某种折叠......我也在sepBy文档中看到,但这种方法似乎更适合我的应用程序。

编辑:哦,实际上现在我想到它实际上应该类似于fix......不知道我是怎么忘记的。

EDIT2: Rotsor 用他的替代方案为我的例子提出了一个很好的观点,但恐怕我的 …

parsing haskell attoparsec

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

在Haskell中将具有已知长度的列表转换为嵌套对的最简单方法是什么?

如何将具有已知长度的列表转换为嵌套对?换句话说,填充下面的类型孔最方便的方法是什么?

_ [1,2]       :: (Int,Int)
_ [1,2,3]     :: ((Int,Int),Int)
_ [1,2,3,4]   :: (((Int,Int),Int),Int)
_ [1,2,3,4,5] :: ((((Int,Int),Int),Int),Int)
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,类型孔不必是相同的功能,我正在寻找一个方便的模式(如果存在方便的模式)来填补空洞.

haskell tuples list

4
推荐指数
2
解决办法
208
查看次数

在 Haskell 中导出读取(和显示)时避免反斜杠编码 utf8 字符

Text派生Read实例时,我无法将 utf8 字符解析为。例如,当我在ghci 中运行以下...

> import Data.Text
> data Message = Message Text deriving (Read, Show)
> read ("Message \"?\"") :: Message
Message "\8594"
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来使我的文本保持在Messageutf-8 编码中吗?即结果应该是...

Message "?"
Run Code Online (Sandbox Code Playgroud)

(PS 我已经将我的序列化消息接收为Text,但目前需要unpack到 aString才能调用read。我很想避免这种情况......)

编辑:啊对不起,答案正确地指出它show不是read转换为"\8594"- 有没有办法在没有反斜杠编码的情况下再次show转换回Text

encoding parsing text haskell utf-8

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