我想知道如何使用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__
作品很好:)
我想在Hackage中使用一些特定于平台的库(例如inotify,kqueue).但是,有关如何使用条件编译在平台之间切换的文档似乎有点稀疏.我在查找相关文档时遇到了一些麻烦......
我可以使用哪些预处理器定义在平台之间切换?
如何设置我的cabal文件分别在linux/osx上包含/排除inotify/kqueue?
我希望在此处记录它可能对其他人也有用,所以提及其他常见平台可能是值得的.到处寻找这些东西真是太傻了.
我的应用程序使用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)
这是有效的,但感觉有点不太正常,因为它是如此的样板.那么,有两个问题:
我希望一起使用System.INotify和System.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
以安全的方式获取当前状态文件快照的函数?
我想知道Handler
在Yesod中为用户/权限或资源添加角色的最佳方法是什么.有没有人有这种东西的先前艺术?是否有任何方法利用类型系统来帮助防止漏洞(并且还要保持数据库查询以检查所有权等)?
编辑:很抱歉错过了这个 - 我确实注意到实际上有一个部分,我乍一看(我认为因为没有提及访问/角色/权限),在Yesod书中的授权.这似乎在路由器级别使用PUT/POST的写标志进行访问控制.它本身看起来并不十分复杂,但它看起来很适合在顶部构建抽象...
我在理解如何升级cabal沙箱中的软件包时遇到了一些麻烦.我想升级esqueleto-1.3.4.5
到esqueleto-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
.
我正在尝试构造一个Conduit
接收为输入ByteString
s(每个块大小约1kb)并生成ByteString
512kb块的输出连接.
这看起来应该很简单,但是我遇到了很多麻烦,我尝试过的大多数策略只能成功地将块分成更小的块,我没有成功连接更大的块.
我开始尝试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程序,它使用我用C++开发的外部静态库.它通过ghc的FFI(外部函数接口)访问lib.在这个库里面我想对控制台做一些输出.但是,它看起来像c ++方面的东西没有正确的stdout句柄,因为输出没有出现在控制台上.那么,我的问题是:
附加说明:我将libstdc ++直接链接到可执行文件(即ghc -lstdc ++ ...),我天真地认为这是正确的方法.似乎运作良好
免责声明:对于Haskell来说还是一个新手,所以宝贝现在迈出了步伐; P
我一直在编写 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 用他的替代方案为我的例子提出了一个很好的观点,但恐怕我的 …
如何将具有已知长度的列表转换为嵌套对?换句话说,填充下面的类型孔最方便的方法是什么?
_ [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)
编辑:请注意,类型孔不必是相同的功能,我正在寻找一个方便的模式(如果存在方便的模式)来填补空洞.
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)
我可以做些什么来使我的文本保持在Message
utf-8 编码中吗?即结果应该是...
Message "?"
Run Code Online (Sandbox Code Playgroud)
(PS 我已经将我的序列化消息接收为Text
,但目前需要unpack
到 aString
才能调用read
。我很想避免这种情况......)
编辑:啊对不起,答案正确地指出它show
不是read
转换为"\8594"
- 有没有办法在没有反斜杠编码的情况下再次show
转换回Text
?
haskell ×10
io ×2
parsing ×2
yesod ×2
ajax ×1
algorithm ×1
attoparsec ×1
bookmarklet ×1
c++ ×1
cabal ×1
cabal-dev ×1
chunking ×1
conduit ×1
cors ×1
encoding ×1
ffi ×1
file-io ×1
ghc ×1
graphics ×1
list ×1
mmap ×1
python ×1
rbac ×1
reflection ×1
tesselation ×1
text ×1
topology ×1
tuples ×1
utf-8 ×1