我正在尝试从定期提供XML文件的网页获取股票市场报价(样本数据).XML的结构非常简单,如下所示:
<?xml version="1.0"?>
<Contents>
<StockQuote Symbol="PETR3" Date="21-12-2010" Time="13:20" Price="23.02" />
</Contents>
Run Code Online (Sandbox Code Playgroud)
(它不止于此,但这足以作为一个例子).
我想将它解析为数据结构:
data Quote = Quote { symbol :: String,
date :: Data.Time.Calendar.Day,
time :: Data.Time.LocalTime.TimeOfDay,
price :: Float}
Run Code Online (Sandbox Code Playgroud)
我或多或少地了解Parsec如何工作(在真实世界Haskell书的水平上),我尝试了一些Text.XML库,但我可以开发的是一个有效的代码,但对于这么简单的任务来说太大了,看起来像一个一半是黑客,而不是最好的.
我不知道了很多关于解析器和XML(我基本上知道我在RWH书中读到的东西,我从来没有使用解析器)(我只是做统计和数值编程,我不是一个计算机科学家).是否有一个XML解析库,我可以在其中告诉模型是什么并立即提取信息,而无需手工解析每个元素而无需解析纯字符串?
我正在考虑这样的事情:
myParser = do cont <- openXMLElem "Contents"
quote <- openXMLElem "StockQuote"
symb <- getXMLElemField "Symbol"
date <- getXMLElemField "Date"
(...)
closequote <- closeXMLElem "StockQuote"
closecont <- closeXMLElem "Contents"
return (symb, date)
results = parse myParser "" myXMLString
Run Code Online (Sandbox Code Playgroud)
我不需要处理纯字符串并自己创建组合器(我很擅长).
编辑:我可能需要阅读一些关于解析器(不仅是Parsec)和关于XML的最小值的解释(刚刚以正确的方式完成).你们推荐一些东西吗?
我必须解析的真正字符串是这样的:
stringTest = "<?xml …Run Code Online (Sandbox Code Playgroud) 如何boost::numeric::ublas::vector和std::vector在运行时的效率比较?
是否可以安全地假设我可以通过编写将整个程序从使用转换std::vector为使用boost::numeric::ublas::vector:
#include <boost/numeric/ublas/vector.hpp>
using namespace boost::numeric::ublas;
Run Code Online (Sandbox Code Playgroud)
而不是#include<vector>?我可以只使用增强矢量,就像它们在所有方面都是STL矢量一样吗?
做从功能<algorithm>有增强载体的工作?他们使用相同的迭代器吗?
它们在C++ 0x中工作吗?它们适用于基于范围的循环吗?
根据Typeclassopedia和这个链接,一个类型只能有一个Functor实例(链接中有一个证据).但我的理解是,给定类型可能有多个可能的Monad实例,这是对的吗?但对于给定的Monad实例,有一个免费的Functor实例
fmap f xs = xs >>= return . f
Run Code Online (Sandbox Code Playgroud)
由此我得出结论,如果我偶然发现一个我可以用Monad不同方式定义多个实例的类型,那么fmap上面派生的函数必须对所有它们都相等,换句话说,如果我有两对函数:
bind_1 :: m a -> (a -> m b) -> m b
unit_1 :: a -> m a
bind_2 :: m a -> (a -> m b) -> m b
unit_2 :: a -> m a
Run Code Online (Sandbox Code Playgroud)
对于相同类型的构造函数m,必然:
xs `bind_1` (unit_1 . f) == xs `bind_2` (unit_2 . f)
Run Code Online (Sandbox Code Playgroud)
为了所有xs :: …
有没有办法轻松地"提升"Haskell中的类实例?
我经常需要为某些类创建例如Num实例,这些类只是通过类型构造函数"提升"Num结构,如下所示:
data SomeType a = SomeCons a
instance (Num a)=>Num SomeCons a where
(SomeCons x) + (SomeCons y) = SomeCons (x+y)
negate (SomeCons x) = SomeCons (negate x)
-- similarly for other functions.
Run Code Online (Sandbox Code Playgroud)
有没有办法避免这个样板并自动"提升"这个Num结构?当我试图学习存在性时,我通常必须使用Show和其他类来执行此操作,并且编译器不会让我使用deriving(Show).
我想使用boost accumulators来计算作为向量的变量的统计信息.有一个简单的方法来做到这一点.我认为不可能使用最愚蠢的事情:
using namespace boost::accumulators;
//stuff...
accumulator_set<vector<double>, stats<tag::mean> > acc;
vector<double> some_vetor;
//stuff
some_vector = doStuff();
acc(some_vector);
Run Code Online (Sandbox Code Playgroud)
也许这很明显,但无论如何我都试过了.:P
我想要的是有一个累加器来计算一个向量,它是许多向量的分量的平均值.有一个简单的方法吗?
编辑:
我不知道我是否彻底清楚.我不想要这个:
for_each(vec.begin(), vec.end(),acc);
Run Code Online (Sandbox Code Playgroud)
这将计算给定矢量的条目的平均值.我需要的是不同的.我有一个将吐向量的函数:
vector<double> doSomething();
// this is a monte carlo simulation;
Run Code Online (Sandbox Code Playgroud)
我需要多次运行并计算这些向量的矢量平均值:
for(int i = 0; i < numberOfMCSteps; i++){
vec = doSomething();
acc(vec);
}
cout << mean(acc);
Run Code Online (Sandbox Code Playgroud)
我希望mean(acc)是一个向量本身,其entry [i]将是累积向量的条目[i]的平均值.
在Boost的文档中有关于此的暗示,但没有任何明确的.而我有点愚蠢.:P
hackage中是否有任何库可以解析haskell代码并检查它是否是有效代码?
我愿意使用进化模型,我想检查生成的代码串是否可以编译而无需将它们写入磁盘并运行编译器.
理想情况下,能够在字符串中运行代码也很好,但只检查代码的有效性是可以的.
如果你知道检查其他语言(lisp,C,...)的解析器库(在haskell中),它也会很好.
我在python中遇到以下问题.
我需要并行进行一些计算,我需要在文件中顺序编写结果.所以我创建了一个接收multiprocessing.Queue文件句柄的函数,进行计算并在文件中打印结果:
import multiprocessing
from multiprocessing import Process, Queue
from mySimulation import doCalculation
# doCalculation(pars) is a function I must run for many different sets of parameters and collect the results in a file
def work(queue, fh):
while True:
try:
parameter = queue.get(block = False)
result = doCalculation(parameter)
print >>fh, string
except:
break
if __name__ == "__main__":
nthreads = multiprocessing.cpu_count()
fh = open("foo", "w")
workQueue = Queue()
parList = # list of conditions for which I want to …Run Code Online (Sandbox Code Playgroud) 我需要一些Ints作为随机数生成的种子,所以我想使用系统时间作为种子的旧技巧.
所以我尝试使用Data.Time包,我设法做了以下事情:
import Data.Time.Clock
time = getCurrentTime >>= return . utctDayTime
Run Code Online (Sandbox Code Playgroud)
当我运行时,我会得到以下内容:
Prelude Data.Time.Clock> time
55712.00536s
Run Code Online (Sandbox Code Playgroud)
类型time是IO DiffTime.我希望看到一个IO Something类型,因为这取决于程序外部的东西.所以我有两个问题:
a)是否有可能以某种方式解包IO并获取基础DiffTime值?
b)如何将DiffTime转换为整数值,以秒为单位?有一个功能,secondsToDiffTime但我找不到它的逆.
是否有某种方式(任何方式)在类型类中实现约束?
作为我正在谈论的一个例子,假设我想将一个Group实现为一个类型类.如果有三个函数,那么类型将是一个组:
class Group a where
product :: a -> a -> a
inverse :: a -> a
identity :: a
Run Code Online (Sandbox Code Playgroud)
但这些不是任何功能,但它们必须通过一些限制来联系.例如:
product a identity = a
product a (inverse a) = identity
inverse identity = identity
Run Code Online (Sandbox Code Playgroud)
等等...
有没有办法在类的定义中强制执行这种约束,以便任何实例都会自动继承它?举个例子,假设我想实现C2组,定义如下:
data C2 = E | C
instance Group C2 where
identity = E
inverse C = C
Run Code Online (Sandbox Code Playgroud)
这两个定义唯一地确定C2(上述约束定义了所有可能的操作 - 实际上,由于约束,C2是唯一可能具有两个元素的组).有没有办法让这项工作?
我最近强迫自己学习C++,我刚读完了Herbert Schildt的C++:The Complete Reference一书.我喜欢这本书,并认为我或多或少得到了全局.我注意到,当我尝试与其他人一起检查我使用我学到的材料编写的东西时,它们通常被认为是非惯用的,并且被STL方式取代,这样做更安全,更容易(好吧,这本书没有'涵盖STL和Boost库).
所以我想问一下:学习优秀C++程序模式有哪些好的资源?我在哪里可以从"C++方式"学习基本模式来做事,而不仅仅是在C++中重复C模式?
我对包含STL和Boost内容的来源特别感兴趣.
haskell ×6
boost ×3
c++ ×3
parsing ×2
stl ×2
typeclass ×2
accumulator ×1
class ×1
constraints ×1
file-io ×1
free-theorem ×1
functor ×1
idiomatic ×1
monads ×1
parsec ×1
python ×1
queue ×1
systemtime ×1
templates ×1
type-systems ×1
ublas ×1
vector ×1
xml ×1