即为什么以下"循环依赖"不可能?
public class Something implements Behavior {
public interface Behavior {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
由于接口不引用外部类,因此应该允许; 但是,编译器迫使我在类外定义那些接口.这种行为有合理的解释吗?
基本上我正在尝试使用以下代码将自定义鼠标单击事件发送到文本输入元素(请参阅此jsFiddle):
function simulateClick(id) {
var clickEvent = document.createEvent("MouseEvents");
clickEvent.initMouseEvent("click", true, true, window, 1, 0, 0, 0, 0,
false, false, false, false, 0, null);
var element = document.getElementById(id);
element.dispatchEvent(clickEvent);
}
Run Code Online (Sandbox Code Playgroud)
当我在一个type="checkbox"元素上运行该代码时,它可以很好地工作,但在type="text"元素上调用它时根本不起作用.
现在这里是initMouseEvent()关于MDN 的定义:
event.initMouseEvent(type, canBubble, cancelable, view,
detail, screenX, screenY, clientX, clientY,
ctrlKey, altKey, shiftKey, metaKey,
button, relatedTarget);
Run Code Online (Sandbox Code Playgroud)
所以在上面的例子中screenX, screenY, clientX并且clientY都是0(仍然,上面的代码与复选框一起完全正常,无论它们的位置如何).我尝试捕获一个真实的事件并将屏幕和客户端坐标传递给cusom事件,但无济于事.
我可能由于安全原因,文本输入元素可能会忽略自定义鼠标事件,但是element.focus()它也不应该工作.
任何想法或见解将不胜感激!
如果我在一些可能多次实例化的类中有一个很少使用的集合,我有时可能会求助于以下"成语"以节省不必要的对象创建:
List<Object> list = null;
void add(Object object) {
if (list == null)
list = new ArrayList<Object>();
list.add(object);
}
// somewhere else
if (list != null)
for (Object object : list)
;
Run Code Online (Sandbox Code Playgroud)
现在我想知道我是否无法使用删除那些空检查Collections.emptyList(),但是我必须改变if check in add()like:
if (list == Collections.<Object>emptyList())
list = new ArrayList<Object>();
Run Code Online (Sandbox Code Playgroud)
除了每次分配一个新的空集合之外,还有更好的方法来处理这个问题吗?
编辑:只是为了清楚,我想使用Collections.emptyList(),但上面检查add()真的很难看......我想知道是否有更好的方法来做它甚至一个完整的其他方式处理这个.
我正在尝试记住以下功能:
gridwalk x y
| x == 0 = 1
| y == 0 = 1
| otherwise = (gridwalk (x - 1) y) + (gridwalk x (y - 1))
Run Code Online (Sandbox Code Playgroud)
看着这个我想出了以下解决方案:
gw :: (Int -> Int -> Int) -> Int -> Int -> Int
gw f x y
| x == 0 = 1
| y == 0 = 1
| otherwise = (f (x - 1) y) + (f x (y - 1))
gwlist :: [Int]
gwlist …Run Code Online (Sandbox Code Playgroud) 想象一下以下的树:
A
/ \
B C
/ \ \
D E F
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来查询例如F是否是A的后代(注意:F不需要是F 的直接后代),在这种情况下,这将是真的.只需要针对较大的潜在后代节点池测试有限数量的潜在父节点.
更新:在测试节点是否是潜在父池中节点的后代时,需要针对所有潜在父节点对其进行测试.
这是一个想法:
将多路树转换为trie,即将以下前缀分配给上述树中的每个节点:
A = 1
B = 11
C = 12
D = 111
E = 112
F = 121
Run Code Online (Sandbox Code Playgroud)然后,为每个可能的前缀大小保留一个位数组,并添加要测试的父节点,即如果将C添加到潜在的父节点池,请执行以下操作:
1 2 3 <- Prefix length
*[1] [1] ...
[2] *[2] ...
[3] [3] ...
[4] [4] ...
... ...
Run Code Online (Sandbox Code Playgroud)当测试节点是否是潜在父节点的后代时,取其trie前缀,查找第一个"前缀数组"中的第一个字符(见上文),如果存在,则在第二个"前缀中查找第二个前缀字符数组"依此类推,即测试F导致:
F = 1 2 1
*[1] [1] ...
[2] *[2] ...
[3] [3] ...
[4] [4] ...
... ...
Run Code Online (Sandbox Code Playgroud)
所以是的,F是C.的后代.
这个测试似乎是最坏的情况O(n),其中n …
让我们定义一个树T:
A
/ \
B C
/ \
D E
Run Code Online (Sandbox Code Playgroud)
假设一个新节点被添加到E,产生T':
A
/ \
B C
/ \
D E
\
G
Run Code Online (Sandbox Code Playgroud)
在一个可变的语言中,这是一个简单的任务 - 只需更新E的孩子,我们就完成了.然而,在一个不可变的世界中,有必要首先知道E的路径,然后从E +新子导出E',然后导出B',然后导出A'(= T').
这很麻烦; 理想情况下,会有一些函数可以获取E和G(可能还有T)的值并产生T',而不提供到E的路径.
我看到两种可能的方法来解决这个问题:
考虑到合理的表现,我想要的是什么?非常感谢任何输入!
拿这个(简化的)例子:
(defmacro make [v & body]
`(let [~'nv ~(some-calc v)]
~(map #(if (= % :value) 'nv %) body)))
Run Code Online (Sandbox Code Playgroud)
现在这个符号nv是硬编码的.有没有办法以某种方式gensym nv并仍然能够在地图功能中使用它?
顺便说一句,这实际上是一个照应的宏吗?
我的目标是消除这样()的术语:
(a, b) -> (a, b)
((), b) -> b
(a, ((), b)) -> (a, b)
...
Run Code Online (Sandbox Code Playgroud)
这是代码:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Simplify where
import Data.Type.Bool
import Data.Type.Equality
type family Simplify x where
Simplify (op () x) = Simplify x
Simplify (op x ()) = Simplify x
Simplify (op x y) = If (x == Simplify x && y == Simplify y)
(op x y)
(Simplify (op (Simplify x) …Run Code Online (Sandbox Code Playgroud) 我正在Erlang中编写REST服务,需要先验证接收到的数据,然后再将其传递给其他内部函数进行进一步处理; 为了做到这一点,我目前正在使用这样的嵌套case表达式:
case all_args_defined(Args) of
true ->
ActionSuccess = action(Args),
case ActionSuccess of
{ok, _} -> ...;
{fail, reason} -> {fail, reason}
end,
_ ->
{fail, "args not defined"}
end,
...
Run Code Online (Sandbox Code Playgroud)
我意识到这有点难看,但这样我可以提供详细的错误信息.另外,我不认为通常的make it crash理念在这里适用 - 我不希望我的REST服务崩溃并且每当有人抛出无效参数时重新启动它.
但是,我正在考虑放弃所有那些cases支持伞形try/catch块来捕捉任何badmatch错误的人 - 这会有用吗?
fun() ->
true = all_args_defined(Args),
{ok, _} = action(Args).
%% somewhere else
catch fun().
Run Code Online (Sandbox Code Playgroud) 我刚刚发现了以下lambda演算表达式:
(((? f . (? x . (f x))) (? a . a)) (? b . b))
Run Code Online (Sandbox Code Playgroud)
所以这是一个函数,它接受一个参数f并返回另一个带有参数x的函数,并产生应用于f的x的结果.上述表达式的结果将是(λb.b).
这让我想起部分应用和currying,但是"由内而外"的功能应用程序(fx)引起了我的兴趣.
那个表达有更深刻的理论意义吗?
lambda functional-programming combinators lambda-calculus higher-order-functions
haskell ×2
java ×2
tree ×2
algorithm ×1
clojure ×1
collections ×1
combinators ×1
cyclic ×1
dependencies ×1
descendant ×1
empty-list ×1
erlang ×1
immutability ×1
inheritance ×1
javascript ×1
lambda ×1
macros ×1
memoization ×1
mouseevent ×1
null ×1
trie ×1
typechecking ×1
zipper ×1