在Haskell中安全地创建临时目录的正确方法是什么? System.IO
提供的方法来创建临时文件,但我无法找到任何东西,确实为目录相同,既不存在也没有System.Directory
,System.Posix.Directory
也不System.Posix.Temp
.有一个我忽略的功能,还是我需要自己写一个?(如果是这样,是否有任何可以避免的危险,就像创建临时文件一样?)
我正在尝试编写一个QuickCheck属性,它将一个或多个函数作为输入.为了简单起见,请考虑一个属性来检查函数组合是否等同于连续函数应用程序,以及一个快速而肮脏的测试驱动程序:
import Test.QuickCheck
prop_composition :: (Int -> Int) -> (Int -> Int) -> Int -> Bool
prop_composition f g x = (f . g) x == f (g x)
main :: IO ()
main = quickCheck prop_composition
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不能编译,因为属性的输入需要实现,Show
以便QuickCheck可以报告导致失败的输入,但是没有Show
函数的实现:
Test.hs:10:7:
No instance for (Show (Int -> Int))
arising from a use of `quickCheck' at Test.hs:10:7-33
Possible fix: add an instance declaration for (Show (Int -> Int))
In the expression: quickCheck prop_composition
In the definition of …
Run Code Online (Sandbox Code Playgroud) 在分析用GHC编写的Haskell程序时,类型类函数的名称在.prof文件中被破坏,以区分一个实例的实现与另一个实例的实现.如何解析这些名称以找出它是哪种类型的实例?
例如,假设我有以下程序,其中类型Fast
和Slow
两者都实现Show
:
import Data.List (foldl')
sum' = foldl' (+) 0
data Fast = Fast
instance Show Fast where
show _ = show $ sum' [1 .. 10]
data Slow = Slow
instance Show Slow where
show _ = show $ sum' [1 .. 100000000]
main = putStrLn (show Fast ++ show Slow)
Run Code Online (Sandbox Code Playgroud)
我编译-prof -auto-all -caf-all
并运行+RTS -p
.在生成的.prof文件中,我看到最高成本中心是:
COST CENTRE MODULE %time %alloc
show_an9 Main 71.0 83.3
sum' Main 29.0 16.7
Run Code Online (Sandbox Code Playgroud)
在树中,我同样看到(省略不相关的行): …
我正在尝试使用Cabal和GHC 6.12.1从Hackage 安装nano-hmac-0.2.0软件包(我想要的软件包的依赖项),但它失败并出现以下错误:
Data/Digest/OpenSSL/HMAC.hsc:1:0:
Warning: Module `Prelude' is deprecated:
You are using the old package `base' version 3.x.
Future GHC versions will not support base version 3.x. You
should update your code to use the new base version 4.x.
<no location info>:
Failing due to -Werror.
Run Code Online (Sandbox Code Playgroud)
果然,包的.cabal文件中包含以下行:
ghc-options: -Wall -Werror -O2 -fvia-C
Run Code Online (Sandbox Code Playgroud)
我希望能够覆盖该-Werror
选项,以便我可以在不手动修改.cabal文件的情况下安装软件包,但找不到可行的方法.特别是,我尝试传递--ghc-options
给Cabal以坚持-Wwarn
GHC的参数列表,如下所示:
$ cabal install nano-hmac-0.2.0 -v2 --ghc-options='-Wwarn'
Run Code Online (Sandbox Code Playgroud)
但这不符合我的要求; 详细输出验证是否-Wwarn
已添加到GHC的参数列表的开头,但是-Werror
.cabal文件稍后出现并且似乎覆盖它:
/usr/bin/ghc -Wwarn --make -package-name nano-hmac-0.2.0 -hide-all-packages -fbuilding-cabal-package …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Happstack,Heist和Web路由编写应用程序服务器,但是我很难弄清楚如何让拼接访问不是源自我的应用程序的monad堆栈的值.
出现这种情况有两种情况:
请考虑以下尝试提供以下URL的示例程序:
由于参数显示在URL路径而不是查询字符串中,因此它将通过Web路由而不是来自ServerPartT monad提取.但是,从那里开始,没有明确的方法将参数放在拼接可以看到的位置,因为它们只能访问应用程序monad.
将ReaderT粘贴在monad堆栈上的明显解决方案有两个问题:
从Snap文档中窥视,看起来Snap通过有效地将它们复制到查询字符串中来处理URL路径中的参数,从而回避问题.但这不是Happstack和网络路由的选择,此外,有两种不同的方式让URL指定相同的值会让我觉得安全性是一个坏主意.
那么,是否有一种"正确"的方式将非应用程序monad请求数据公开给拼接,或者我是否需要放弃Heist并使用像Blaze-HTML这样的东西而不是问题?我觉得我错过了一些明显的东西,但无法弄清楚它可能是什么.
示例代码:
{-# LANGUAGE TemplateHaskell #-}
import Prelude hiding ((.))
import Control.Category ((.))
import Happstack.Server (Response, ServerPartT, nullConf, ok, simpleHTTP)
import Happstack.Server.Heist (render)
import Text.Boomerang.TH (derivePrinterParsers)
import Text.Templating.Heist (Splice, bindSplices, emptyTemplateState, getParamNode)
import Text.Templating.Heist.TemplateDirectory (TemplateDirectory, newTemplateDirectory')
import Web.Routes (RouteT, Site, runRouteT)
import Web.Routes.Boomerang (Router, anyString, boomerangSite, int, lit, (<>), (</>))
import Web.Routes.Happstack (implSite)
import qualified Data.ByteString.Char8 as C …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用happstack-server-tls创建一个Web服务器,该服务器将使用由私有CA签名的证书.不幸的是,如果我给服务器一个自签名证书,那么TLS握手似乎只会成功.Wireshark显示,当我的服务器使用由我的私有CA签名的证书时,它不会向客户端发送服务器Hello消息,而是发送致命(2)警报消息,报告握手失败(40).
这不是Web浏览器拒绝服务器证书的情况; Wireshark显示TLS握手甚至从未达到服务器向浏览器提供证书的程度.也不是未能就加密算法达成一致的情况,因为服务器使用与我想要使用的算法相同的自签名证书运行时没有问题.证书本身似乎有效,因为它openssl s_server
在命令行上按预期工作,并且happstack-server-tls似乎使用OpenSSL进行TLS操作,所以我认为这不是证书生成方式的问题.
为了让happstack-server-tls与非自签名证书一起工作,我需要做些什么?
以下是一个最小的Haskell程序,它使用happstack-server-tls在端口8443上运行Web服务器来演示该问题.它最多需要三个参数:包含服务器私钥的文件,包含服务器证书的文件,以及(可选)包含CA证书的文件.
module Main ( main ) where
import Happstack.Server.Response (ok)
import Happstack.Server.SimpleHTTPS (TLSConf (..), nullTLSConf, simpleHTTPS)
import System.Environment (getArgs)
main :: IO ()
main = do args <- getArgs
case args of
[keyFile, certFile] -> runServer keyFile certFile Nothing
[keyFile, certFile, caFile] -> runServer keyFile certFile (Just caFile)
runServer :: FilePath -> FilePath -> Maybe FilePath -> IO ()
runServer keyFile certFile caFile = simpleHTTPS conf $ ok ":-)" …
Run Code Online (Sandbox Code Playgroud) 我经常使用这个网站,以解决我在Python编程时遇到的小问题.这一次,我无法找到适合我情况的合适解决方案.所以,这是我的问题:
我想动态地向gtk.VBox小部件添加条目.问题是它不能按我想要的方式工作.我只是有一个按钮,其动作是向VBox添加一个额外的小部件.不幸的是,小部件没有出现在窗口上.我想,我必须添加类似重绘函数调用的东西,但我没有找到类似的东西.这是一个示例代码,显示了我的问题:
import gtk
class DynamicVbox:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("destroy", self.close_application)
self.window.set_size_request(400,320)
#a hBox to put the button and the dynamic vBox
hBox = gtk.HBox(False, 0)
addButton = gtk.Button("add checkbox")
addButton.connect("clicked", self.AddCheckButton)
self.vBox = gtk.VBox(False, 0)
self.vBox.pack_start(gtk.CheckButton("CheckButton"), True, True, 1)
hBox.pack_start(self.vBox, True, True, 5)
hBox.pack_end(addButton, False, False, 5)
self.window.add(hBox)
#start gtk
self.window.show_all()
gtk.main()
def AddCheckButton(self, button):
self.vBox.pack_start(gtk.CheckButton("CheckButton"), True, True, 1)
print "adding checkbox..."
def close_application(self, widget):
gtk.main_quit()
# run it
a = DynamicVbox()
Run Code Online (Sandbox Code Playgroud)
感谢任何帮助.提前致谢.