我试图使用Parsec来解析这样的事情:
property :: CharParser SomeObject
property = do
name
parameters
value
return SomeObjectInstance { fill in records here }
Run Code Online (Sandbox Code Playgroud)
我正在实现iCalendar规范,并且每个类似都有一个名称:parameters:value triplet,非常类似于XML具有名称的方式:attributes:content triplet.事实上,您可以非常轻松地将iCalendar转换为XML格式(我不能真正看到它的优点).
我的观点是,参数根本不必按任何顺序排列,每个参数可能有不同的类型.一个参数可以是字符串,而另一个参数是另一个元素的数字id.它们可能没有任何相似性,最后,我想将它们正确地放在正确的记录字段中,以便我希望解析器返回的"SomeObjectInstance".我如何去做这类事情(或者你能指出一个例子,有人必须解析这样的数据)?
谢谢,我知道我的问题可能有点困惑,但这反映了我对我需要做的事情的理解程度.
编辑:我试图避免给出预期的输出(因为它很大,不是因为它是隐藏的)但这里是一个输入文件的例子(来自维基百科):
开始:VCALENDAR
版本:2.0
PRODID: - // hacksw/handcal // NONSGML v1.0 // EN开始
:VEVENT
UID:uid1@example.com
DTSTAMP:19970714T170000Z
ORGANIZER; CN = John Doe:MAILTO:john.doe@example .com
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
摘要:巴士底日派对
END:VEVENT
END:VCALENDAR
正如您所看到的,它在VCalendar中包含一个VEvent,我在这里创建了代表它们的数据结构.
我正在尝试编写一个解析器来解析这种类型的文件到我的数据结构中,我被困在我需要处理任何类型的任何顺序的属性的位置; date,time,int,string,uid等.我希望在不重复整个iCalendar规范的情况下更有意义.
我正在与合作伙伴一起开发Open Office文档,我们正在使用subversion进行协作.但是,我们将文档保存为.odt文件,而subversion将其作为二进制文件类型读取.因此,我担心当我们合并文件和差异弹出时,如果存在冲突,我们将无法充分执行合并; 我们将无法理解原始的.odt文件.
所以我的问题是"如何在Open Office中保存文档,以便它保留您期望和想要的所有格式,但保存为二进制文件,因此可以轻松合并?"
或者我使用错误的方法来做到这一点?(这很可能)
我正在使用Haskeline程序包,我想在执行任何操作之前从命令行连续获取三个字符串,并且我已经想出了对我来说似乎是一个简洁的解决方案.但我相信可能有更好的方法来做到这一点.我正在寻找使用Haskeline包时的最佳实践.请评估以下示例代码的优点:
import System.Console.Haskeline
import Control.Monad.Trans
import Control.Monad.Maybe
import Data.Maybe
import Control.Monad
main :: IO ()
main = runInputT defaultSettings (runMaybeT getStrings) >>= print
getStrings :: MaybeT (InputT IO) (String, String, String)
getStrings = do
mone <- lift $ getInputLine "food> "
notNothing mone
mtwo <- lift $ getInputLine "drink> "
notNothing mtwo
mthree <- lift $ getInputLine "dessert> "
notNothing mthree
return (fromJust mone, fromJust mtwo, fromJust mthree)
where
notNothing a = guard (a /= Nothing)
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它完成了提前终止的任务,但它仍然看起来有点令人讨厌.我正在考虑尝试将notNothing和getInputLine转换为单行,如:
mone …Run Code Online (Sandbox Code Playgroud) 我正在尝试播放视频,其中视频的第一帧和最后一帧与静态背景图像匹配.但是我在影片剪辑之前和之后看到全屏黑色闪光.如何避免这种全屏黑色闪光?
我在Perl中有以下代码:
if (index ($retval, $_[2]) != -1) {
@fs = split ($_[2], $_[1]);
Run Code Online (Sandbox Code Playgroud)
$_[2]是分隔符变量,$_[1]是分隔符可能存在的字符串.($_[0]在别处使用)您可能已经猜到这些代码在这些变量名称的子例程中.
无论如何,在我的问题上,当我的分隔符是无关紧要的东西'a'或':'代码工作应该如此.但是,当它被Perl正则表达式解析时,就像一个'\'字符一样,那么它就不会像它应该的那样工作.这是有道理的,因为在拆分函数Perl会看到类似的东西:
split (/\/, $_[1]);
Run Code Online (Sandbox Code Playgroud)
这根本没有意义,因为它会想要这个:
split (/\//, $_[1]);
Run Code Online (Sandbox Code Playgroud)
因此,考虑到所有这一点,我无法回答的问题是:"我如何制作它以便我放入的任何分隔符$_[2]或所有ASCII字符都被视为它应该是的字符和没有被解释为别的什么?"
提前致谢,
罗伯特
我刚刚发现了Endo类型,这要归功于network-api-support软件包,我发现需要能够将Maybe值抛到Endo中.结果我写了一个名为maybeEndo的函数.以下是使用它的示例:
setProxy :: Proxy -> RequestTransformer
setProxy (Proxy pHost pPort) = Endo $ addProxy pHost pPort
maybeEndo :: (a -> Endo b) -> Maybe a -> Endo b
maybeEndo _ Nothing = Endo id
maybeEndo f (Just v) = f v
setPotentialProxy :: Maybe Proxy -> RequestTransformer
setPotentialProxy = maybeEndo setProxy
Run Code Online (Sandbox Code Playgroud)
让我印象深刻的是,这似乎应该被封装到某种类型的模式中.
我正在为Android应用程序构建Adobe Air,我遇到了一个大问题,我使用旧的flash air扩展程序向Android市场发布了一个应用程序,该应用程序使用前缀'app'保存了应用程序ID.
现在我已经升级了扩展程序,现在它会使用前缀"air"保存应用程序ID.
这意味着我不能再向我的应用程序发布更新; 那我该怎么办?
使用过时扩展的问题在于,在发布更新后,用户无法打开应用程序,直到清除缓存文件.
这个问题是这个问题的延续,但要求更具体的方案.
可以说我们有以下课程:
public class Person {
private Foot left, right;
public Person(Foot left, Foot right) {
this.left = left;
this.right = right;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道如果我们将其转化为以下内容,是否可以从GC的角度对以下类进行优化:
public class Person {
private final Foot left, right;
public Person(Foot left, Foot right) {
this.left = left;
this.right = right;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我正在查看这个类,我可以立即告诉左,右变量永远不能提前设置为null.这意味着,只有当父类Person的引用达到零时,GC才需要收集此类的左对象和右对象(并减少对它的引用).它还应该意味着它可以在收集左右脚对象的同时收集人; 也导致更少的运行和加速.
因此,在这个例子中,标记私有成员变量最终是否意味着代码甚至会导致垃圾收集中的次要加速(或者它可能用作加速点)?
我有一个名为倒计时日历的应用程序(这是一个小工具,可以计算Google日历中事件的日期;修复小错误atm).但是我现在想要修复的错误与输入文本时UI重新流动有关.让我举例告诉你.以下是键盘未输出时UI的外观:

这就是键盘输出时的样子:

如何在用户尝试使用键盘时使UI看起来不那么糟糕?