当您创建类型同义词时type,ghc/ghci将在显式使用时使用它而不是原始类型,但绝不会尝试从推断类型向后工作到匹配的同义词.获取类型的最"抽象"同义词对于学习复杂的应用程序和库非常方便,这些应用程序和库定义了monad堆栈的同义词以及可能同义词的同义词.
有没有人写过这样的代码?我想它会回溯并且它也会产生一些假的候选者(例如,如果两个类型是String的别名,那么每当必须解析String时它们都将成为候选者),但它在某些情况下可能是有用的.
我正试图获取角度来读取用户通过<input type="file"控件选择的文件的内容.即使angular没有文件上传控件的指令,也应该很容易通过调用来解决这个问题$apply:
function MyController($scope) {
$('#myFile').on('change', function() {
var that = this;
$scope.$apply(function() { $scope.files = that.files });
});
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这件事永远不会被解雇.就像选择器无法引用正确的DOM元素一样:即使选择器找到元素,文件列表也总是空的.如果我使用js控制台,这也会发生.而是DOM检查器在其属性中具有文件列表.
它让我发疯,但到目前为止我唯一能让它工作的方法是使用一个内联事件处理程序来分配一个全局变量.为什么jquery选择器返回另一个项目?是否有一些模板编译mumbo-jumbo,angular会使选择器混淆?
我需要将JavaScript文件拆分为单个指令.例如
a = 2;
foo()
function bar() {
b = 5;
print("spam");
}
Run Code Online (Sandbox Code Playgroud)
必须分成三个指令.(赋值,函数调用和函数定义).
基本上我需要检测代码,在这些指令之间注入代码以执行检查.分裂为";" 显然不会起作用,因为你也可以用换行结束指令,也许我不想在函数和类定义中设置代码(我还不知道).我使用flex/Bison学习了关于语法的课程,但在这种情况下,这条规则的语义动作是"打印解析树中的所有后代并将我的代码放在最后",这是基本的Bison不能做到的. .我该怎么做呢?我还需要拆分代码,因为我需要使用python-spidermonkey与Python接口.或者......那里是否有一个图书馆可以让我免于重新发明轮子?它不一定是在Python中.
我需要在C++程序中插入一个方法调用(该类驻留在一个单独的共享库中).我以为我可以使用LD_PRELOAD,但我不确定这是如何工作的(我只找到C函数的例子):有没有办法为单个方法设置插入而不从插入的类实现复制任何代码?
我有这个代码:
fmapM :: Monad m => (a -> m b) -> (t, a) -> m (t, b)
fmapM f (id, e) = do
ev <- f e
return (id, ev)
Run Code Online (Sandbox Code Playgroud)
它基本上将函数应用于元组中的第二个元素,然后"提取"monad.由于元组是一个函子,有没有办法为所有函子推广这个?我想不出一个实现,但类型签名应该是:
fmapM :: (Monad m, Functor f) => (a -> m b) -> f a -> m f b
Run Code Online (Sandbox Code Playgroud)
看起来第二步似乎是一个"序列"操作,它从另一个仿函数(列表)中提取monad.但序列并非一般化为所有仿函数.你能想出fmapM的通用实现吗?
编辑:我已经意识到旧版本的拥抱确实已经实现了这个功能.但是,我找不到代码.现在,建议我使用foldable/traversable来实现相同的目的.
我知道可以更改包装类型,以便您可以拥有
f :: (a -> m b)
g :: (b -> m c)
f >>= g :: (a -> m c)
Run Code Online (Sandbox Code Playgroud)
但是有可能改变m吗?如果m是MonadError,由一个实现既Either ErrorA和Either ErrorB,可不知何故,我把它们连?显然我不能直接链接它们,因为它的类型是Left什么?但是,我遇到的情况是我最后show都要打电话,但我找不到更好的解决方案
case mightFail1 of
Left e -> show e
Right v -> either show doStuff mightFail2
Run Code Online (Sandbox Code Playgroud)
在没有我必须明确检查的情况下,它无法正确使用在第一个错误处停止的monadic行为.
我正在尝试为该innerHTML属性定义自定义setter .不幸的是,我在定义setter函数后无法访问底层属性:
$('body')[0].__defineSetter__("innerHTML",
function (val) {
alert("Setting to: " + val);
this.innerHTML = val;
});
Run Code Online (Sandbox Code Playgroud)
此片段填充调用堆栈,因为赋值以递归方式调用setter.Apparenly innerHTML已经是IE8中的重载属性,你可以简单地保存旧的get/set对并在新的属性描述符中使用它.摘自MSDN:
var innerHTMLdescriptor = Object.getOwnPropertyDescriptor(Element.prototype, 'innerHTML');
Object.defineProperty(Element.prototype, 'innerHTML',
{ set: function(htmlVal) {
var safeHTML = toStaticHTML(htmlVal);
innerHTMLdescriptor.set.call(this, safeHTML);
}
});
Run Code Online (Sandbox Code Playgroud)
但是,Chrome的情况似乎并非如此,其中getOwnPropertyDescriptor返回未定义innerHTML.在这种情况下,我如何访问底层属性?
奖金问题:我如何确保将来创建的所有对象都有这种特殊innerHTML行为?是否可以使用DOM原型?似乎重载函数不是我需要的.也许有可能重载DOM构造函数并添加一个调用,__defineGetter__/defineProperty但看起来对构造函数的支持并不常见,所以我想知道是否有任何替代方法.
我正在用 Parsec 编写一个解析器。像 E -> E + E 这样的左递归产生式在 LL 解析器中无法轻松编写,因此 Parsec 提供了buildExpressionParser,它支持中缀、后缀和前缀运算符。但是下标运算符呢?
E -> E [E] 将如何实现?如果我可以在不使用第二个表达式的情况下使用右括号,那么我可以使用buildExpressionParser. 想法?
编辑:我知道有一种左递归消除算法很可能适用于我的语法。我正在寻找一些简单的或抽象的(例如buildExpressionParser)。否则我就用Happy。
我正在研究将使用 C++ 运行时的 JavaScript 语法从 ANTLR3 移植到 ANTLR4(从技术上讲,ANTLR3 版本使用 C 运行时,但现在不相关)。
我正在努力解决的主要问题是性能。我有几个性能问题阻止我接近 0 开销,但我将专注于这个线程中最严重的一个:构建完整的缓存 DFA 并解析命中的文件似乎非常困难未缓存的转换非常慢。
我创建了一个包含 16 个文件的小型测试套件,并将预热和测试阶段分开。(Antlr3 并不真正需要热身,但无论如何)
当热身集 === 测试集(每个 16 个文件)
Test ms
------------------
Antlr3Warmup 338
Antlr4Warmup 55860
Antlr3Test 335
Antlr4Test 439
Run Code Online (Sandbox Code Playgroud)
看起来很接近吧?现在让我们看看如果集合不相交会发生什么(每个 8 个文件)
Test ms
------------------
Antlr3Warmup 78
Antlr4Warmup 32032
Antlr3Test 273
Antlr4Test 24356
Run Code Online (Sandbox Code Playgroud)
很明显,在 32 秒内它甚至没有接近构建 DFA——我们只是构建了足以在相同文件上获得良好性能的东西。我可以尝试向热身套件添加更多文件,但性能似乎从未提高,并且通过更大的热身套件(例如 jquery + angular + react)需要大约 15 米。分析执行表明瓶颈确实是ParserATNSimulator::computeTargetState.
怎么了?有没有更聪明的方法来构建完整的 DFA 缓存?例如Parser::buildCompleteDFA()。
对于某些上下文,我从https://github.com/antlr/grammars-v4/blob/master/javascript/JavaScriptParser.g4开始并重构了 singleExpression 规则,使整个语法 SLL(在此之前,性能似乎是均匀的更差)。
编辑:伊万建议左递归重构可能是罪魁祸首。所以这里是没有重构的相同基准(语法现在是 LL):
当热身集 === 测试集(每个 16 …
我正在阅读一些Haskell教程,并尝试熟悉该语言.我在Monad/MonadPlus教程中看过这个例子:
data Sheep = Sheep {name :: String, mother :: Maybe Sheep, father :: Maybe Sheep}
parent :: Sheep -> Maybe Sheep
parent s = mother s `mplus` father s
Run Code Online (Sandbox Code Playgroud)
我试图用无点样式重写它(就像一个练习,不是说上面是错误的或非惯用的),但我卡住了:显然我可以写一个自定义函数
partialPlus :: (MonadPlus m) => (a -> m b) -> (a -> m b) -> a -> m b
partialPlus f1 f2 = \x -> f1 x `mplus` f2 x
Run Code Online (Sandbox Code Playgroud)
然后使用
parent = partialPlus mother father
Run Code Online (Sandbox Code Playgroud)
但我似乎从LYAH教程中记得,有一种方法可以使用仿函数或应用仿函数来构造计算树,最终可以提供参数以从"仿函数盒"中获取结果.但是我似乎无法在教程中找到该示例.我如何"巧妙地"重写上述内容?
haskell ×5
c++ ×2
javascript ×2
monads ×2
angularjs ×1
antlr4 ×1
applicative ×1
dom ×1
either ×1
file-upload ×1
functor ×1
html5 ×1
innerhtml ×1
methods ×1
parsec ×1
parsing ×1
prototypejs ×1
python ×1
spidermonkey ×1
types ×1