我正在尝试使用Haskell和Thrift做一个简单的Ping Pong.但是,它只会重复一次,然后就会卡住.我假设问题出在正确使用Thrift而不是Haskell中.可能没有正确刷新的东西.是否有任何有Thrift经验的人可以帮助我做出有关如何解决这个问题的有根据的猜测?
服务器:
echorequest :: TXT
echorequest = TXT {
f_TXT_anytxt = Just "Ping"
}
echoreply :: TXT
echoreply = TXT {
f_TXT_anytxt = Just "Pong"
}
serverFunc :: a -> (BinaryProtocol Handle, BinaryProtocol Handle)
-> IO Bool
serverFunc a (h1,h2) = do
let t1 = getTransport h1
dat <- read_TXT h1
-- the following two lines are only for debugging
putStrLn "Recieved data:"
print dat
write_TXT h1 echoreply
tFlush t1
-- the following line is for debugging
putStrLn "Data …Run Code Online (Sandbox Code Playgroud) 我想更好地理解例如Data.Map的实习生.当我在Map中插入一个新的绑定时,由于数据的不变性,我得到一个与旧数据结构加上新绑定相同的新数据结构.
我想了解这是如何实现的.编译器最终是通过使用数百万个绑定复制整个数据结构来实现的吗?通常可以说可变数据结构/数组(例如Data.Judy)或命令式编程语言在这种情况下表现更好吗?在字典/键值存储方面,不可变数据是否具有任何优势?
对我来说,Closure是一个(嵌套?)函数,具有共同定位的数据.
当您在Haskell中编写软件并在之后查看它时,您经常会发现无意中创建的闭包.
我不太适合自己.在什么情况下我会故意想要编码闭包?毕竟,在所有的例子中,我发现共同定位数据的数量是微不足道的,因此在我看来并不像在实践中那样可以证明他们(有意)的创造是合理的.是否有任何Haskell模块可以帮助我有意创建闭包并将其存储在地图中?
我不明白这三种语法之间的区别:
where a = f (b)do a <- f (b)do let a = f (b)我确实理解,虽然这a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有三个工作.另外,我在网上的某个地方读到了每个块,你应该尝试与一个让绑定相处,只是为了"惯用".但我似乎永远不会管理.
我该如何决定使用什么?
我想在Beagleboard上使用基于ARM OMAP 的Haskell GHC/Haskell平台.有没有办法在短期内做到这一点,但没有我必须首先交叉编译,例如LLVM,然后GHC等几周?
我编写了一个模块,为了运行导入模块的主代码需要具有语言扩展名,{-# LANGUAGE OverloadedStrings #-}或者当编译程序时需要给出选项.
如果我{-# LANGUAGE OverloadedStrings #-}在模块中包含这是无法解决的,用户仍然需要在她的代码或编译时执行相同的操作.
有没有什么方法可以在实际模块中做"某事",以便从最终用户解决这个问题,所以说"隐藏"所需的语言扩展?
我不太明白,例如HaLVM或类似技术在(OS)线程方面做了什么.
我理解在使用-threaded选项编译代码时,Haskell多线程RTS将使用OS线程重新分配现有的Haskell线程,从而避免阻止外部调用的行为.现在,当您使用HaLVM时,您可能不必进行任何外来呼叫.但是,我想知道这一切是如何混合的,以及HaLVM运行的工作线程数.是否没有其他情况下OS工作线程的缺失可能导致阻塞或其他不良行为?
我试着做一个简单的计数器.然而,我的柜台并没有上升.在我看来好像每次都通过函数"inc"重新初始化,或者(n + 1)不起作用.我该如何最好地解决这个问题?
inc :: Int -> IO Int
inc n = return (n+1)
main :: IO ()
main = do
let c = 0
let f = 0
putStrLn "Starting..."
conn <- connect "192.168.35.62" 8081
time $
forM_ [0..10000] $ \i -> do
p <- ping conn "ping"
if p=="pong" then inc c
else inc f
printf "Roundtrips %d\n" (c::Int)
Run Code Online (Sandbox Code Playgroud) 我使用了库标准和cmdargs.
当我在没有cmdargs的情况下完全编译程序并运行它时,例如./prog --help然后我从标准中得到一些不需要的响应,关于可能的选项和运行次数等.
当我编译并运行它时,命令行选项首先被我的代码选中,然后按标准读取.Criterion然后报告并且错误告诉我选项--byte是未知的.我没有在标准文档中看到如何关闭或解决这个问题.有没有办法清除我读过它们的命令行选项?否则我需要使用例如CPUTime而不是标准,这对我来说是好的,因为我真的需要额外的功能和标准提供的数据.
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveDataTypeable #-}
import System.Console.CmdArgs
data Strlen = Strlen {byte :: Int} deriving (Data, Typeable, Show)
strlen = cmdArgsMode $ Strlen {byte = def} &= summary "MessagePack benchmark v0.04"
main = do
n <- cmdArgsRun strlen
let datastring = take (byte n) $ randomRs ('a','z') (mkStdGen 3)
putStrLn "Starting..."
conn <- connect "192.168.35.62" 8081
defaultMain [bench "sendReceive" $ whnfIO (mywl conn datastring)]
Run Code Online (Sandbox Code Playgroud) 我在这里找到了一些使用标准的旧例子.看起来好像在2009年,它支持绘制图形的命令行选项.
现在,当我导入标准0.6时,将它包装在一个基本的应用程序中(以测试它)并说./application --help它只给出了很少的可用选项而且与绘图无关.在我看来,对于输出格式和功能而言,它在2009年拥有的功能比2012年更多?
似乎有一个标准到html创建基本的html报告,但没有任何接近例如png输出显示在上面的网站或标准源数据包的示例目录中.
我在哪里可以找到准确和最新的信息?
./application --help
Usage: application [OPTIONS] [BENCHMARKS]
-h, -? --help print help, then exit
-G --no-gc do not collect garbage between iterations
-g --gc collect garbage between iterations
-I CI --ci=CI bootstrap confidence interval
-l --list print only a list of benchmark names
-o FILENAME --output=FILENAME report file to write to
-q --quiet print less output
--resamples=N number of bootstrap resamples to perform
-s N --samples=N number of samples to collect
-t …Run Code Online (Sandbox Code Playgroud)