小编Phi*_*sky的帖子

为什么Java禁止继承内部接口?

即为什么以下"循环依赖"不可能?

public class Something implements Behavior {
    public interface Behavior {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

由于接口不引用外部类,因此应该允许; 但是,编译器迫使我在类外定义那些接口.这种行为有合理的解释吗?

java inheritance dependencies cyclic

19
推荐指数
2
解决办法
2717
查看次数

是否可以将鼠标单击调用事件()到<input type = text>元素?

基本上我正在尝试使用以下代码将自定义鼠标单击事件发送到文本输入元素(请参阅此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()它也不应该工作.

任何想法或见解将不胜感激!

javascript mouseevent dispatchevent

16
推荐指数
1
解决办法
2万
查看次数

Collections.emptyList()而不是null check?

如果我在一些可能多次实例化的类中有一个很少使用的集合,我有时可能会求助于以下"成语"以节省不必要的对象创建:

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()真的很难看......我想知道是否有更好的方法来做它甚至一个完整的其他方式处理这个.

java collections null empty-list

16
推荐指数
4
解决办法
5万
查看次数

Haskell中的两个参数memoization

我正在尝试记住以下功能:

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)

haskell memoization

15
推荐指数
3
解决办法
1654
查看次数

O(1)算法确定节点是否是多路树中另一个节点的后代?

想象一下以下的树:

    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 …

algorithm tree trie descendant multiway-tree

12
推荐指数
1
解决办法
4451
查看次数

在本地编辑纯功能树

让我们定义一个树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的路径.

我看到两种可能的方法来解决这个问题:

  • 父引用 - 这样,每个节点都能够派生到根路径.两个问题:创建两个相互引用的节点(即父< - >子)是一个纯功能语言的问题(任何简单的解决方案?); 每当E - > E'派生出来时,所有 E'的孩子也需要新派生,因为他们现在存储E的旧值而不是E'.
  • zippers - 每个节点在创建时存储拉链,从其父拉链派生.相互引用的问题消失了,但是,当导出E - > E'时,所有E'的儿童拉链也需要派生,因为它们现在指向旧树E.

考虑到合理的表现,我想要的是什么?非常感谢任何输入!

tree immutability zipper purely-functional

10
推荐指数
1
解决办法
208
查看次数

如何避免Clojure中的照应宏?

拿这个(简化的)例子:

(defmacro make [v & body]
  `(let [~'nv ~(some-calc v)]
     ~(map #(if (= % :value) 'nv %) body)))
Run Code Online (Sandbox Code Playgroud)

现在这个符号nv是硬编码的.有没有办法以某种方式gensym nv并仍然能够在地图功能中使用它?

顺便说一句,这实际上是一个照应的宏吗?

macros clojure

9
推荐指数
1
解决办法
737
查看次数

类型减少无限循环

我的目标是消除这样()的术语:

(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)

haskell infinite-loop typechecking type-families

8
推荐指数
1
解决办法
115
查看次数

Erlang错误处理哲学 - 案例与投掷

我正在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)

error-handling erlang exception-handling

6
推荐指数
1
解决办法
2553
查看次数

Lambda演算表达式实现函数应用

我刚刚发现了以下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

6
推荐指数
1
解决办法
699
查看次数