我一直在尝试在haskell中实现协议解析器,我对这种语言很陌生,特别是在涉及monad时.我一直在使用binary-0.5.0.2并描述了我的协议的头部和所有有效载荷.我要解析的消息类似于以下内容:header +(有效负载A,有效负载B,..)其中标头中的字段指定消息具有哪种类型的有效负载.
我已经成功解析了bytestring中的第一条消息,但是对于如何阅读下一条消息感到不知所措,丢弃了在处理第一条消息时读取的字节.
这可能是相当模糊的,但我宁愿得到一个通用解析器的输入,而不是让我的丑陋代码改变为以这种方式工作.
谢谢您的帮助
我一直在尝试使用Nutch在我的urls文件中抓取域的第一页,然后使用Solr使搜索到的爬网数据中的关键字可搜索.到目前为止,我还没有能够以这种方式工作,除非这两个页面链接在一起.
我意识到这可能是没有传入链接的页面的问题,因此PageRank算法丢弃页面内容.我尝试调整参数,以便不在图表中的网址的默认分数更高,但我仍然得到相同的结果.
是否有人知道可以在没有传入链接的页面上构建索引?
谢谢!
我有一些代数数据类型A,B和C各自实现类:
class Dog a where
dog :: a -> Bool
Run Code Online (Sandbox Code Playgroud)
如果我创建一个新的代数数据类型:
data D = A | B | C
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法让D实现Dog而不必再次为A,B和C重新定义每个实例?
谢谢
在Numeric Haskell Repa Tutorial Wiki中,有一段读取(用于上下文):
10.1融合,以及为什么需要它
修复主要取决于阵列融合以实现快速编码.Fusion是编译程序时GHC执行的内联和代码转换组合的一个奇特名称.融合过程将Repa库中定义的数组填充循环与您在自己的模块中编写的"worker"函数合并.如果融合过程失败,那么生成的程序将比它需要的慢得多,通常比使用普通Haskell列表的等效程序慢10倍.另一方面,如果提供融合工作,生成的代码将与等效的干净编写的C程序一样快.一旦了解了正在发生的事情,融合工作并不难.
我不明白的部分是:
"如果融合过程失败,那么生成的程序将比它需要的速度慢得多,通常比使用普通Haskell列表的等效程序慢10倍."
我理解为什么如果流融合失败会运行得慢,但为什么它比列表运行慢得多呢?
谢谢!
最近我以某种形式出现了这个问题.让我们说我想取一个数字x并将一堆高阶函数应用于x生成y.然后我检查y是否满足某个属性,如果确实如此,那么我想返回x.
当我有一个数字列表[x1,x2..xn]并且我应用的函数压缩列表时,这个问题似乎变得非常棘手.例如,我将一个函数应用于列表中的每个元素(生成[y1,y2 ..]),sort,group,然后我想返回最大组的x值.例如:
head . reverse . sort . map (length) . group . sort . map (mod 4) $ [1..10]
Run Code Online (Sandbox Code Playgroud)
答案是6,但是如何重写这样的函数来告诉我哪些元素1到10属于那些6?
我已经玩过传递元组和使用fst的想法,直到snd是必需的,或者编写一个新类来使它像sort这样的东西只适用于类的一个元素,但我似乎无法出现干净的方法
谢谢您的帮助.
我仍然是Haskell的新手,我想我现在已经超过了我的头脑.我的代码如下所示.
data World = World {
intStack :: [Int],
boolStack :: [Bool]
} deriving Show
instance IntStack World where
getIntStack = intStack
putIntStack ints (World _ bools) = World ints bools
instance BoolStack World where
getBoolStack = boolStack
putBoolStack bools (World ints _) = World ints bools
class IntStack a where
getIntStack :: a -> [Int]
putIntStack :: [Int] -> a -> a
class BoolStack a where
getBoolStack :: a -> [Bool]
putBoolStack :: [Bool] -> a -> a
(<=>) …
Run Code Online (Sandbox Code Playgroud)