手头的任务是创建我的Java Web应用程序的一部分,这将允许我以组合方式轻松执行小块代码.手头的任务是允许用户以任何顺序撰写"动作".我正在努力的是将参数传递给我的行动.
一切都从动作界面开始:
public interface Action {
void resolve(Context context);
}
Run Code Online (Sandbox Code Playgroud)
解决操作后,将执行代码.代码可以是任何东西:在Java中调用方法,执行一些Javascript ...
在这里,"背景"对我来说是个问题.每个动作都在特定的上下文中执行.我们的想法是创建操作的用户可以指定从概念中检索哪个对象,例如正在解析当前操作的用户,或者在操作的特定界面中指定的其他对象.
例如,让我们来看看这个动作:
public final class ActionScript implements Action {
private final Parameters parameters;
private final String methodName;
private final ScriptsLibrary library;
public ActionScript(ScriptsLibrary library, String methodName, Parameters parameters) {
this.parameters = parameters;
this.library = library;
this.methodName = methodName;
}
@Override
public void resolve(Context context) {
try {
((Invocable) library.getEngine()).invokeFunction(methodName, context);
} catch (ScriptException | NoSuchMethodException ex) {
throw new RuntimeException(ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它是一个简单的包装器,使用Nashorn在Javascript中调用一个动作.参数可以是任何东西:DB中具有特定ID的对象,用户配置的int/String/boolean值...
操作中的代码可能如下所示:
public class …Run Code Online (Sandbox Code Playgroud) 给定以下数据类型:
data Tree a =
Branch (Tree a) (Tree a)
| Leaf a deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
以下的Functor实例:
instance Functor Tree where
fmap f (Leaf a) = Leaf $ f a
fmap f (Branch t1 t2) = Branch (fmap f t1) (fmap f t2)
Run Code Online (Sandbox Code Playgroud)
如何最好地实现这棵树的Applicative实例?我提出了:
instance Applicative Tree where
pure = Leaf
Leaf f <*> t = f <$> t
Branch t1 t2 <*> Leaf a = t1 <*> Leaf a
Branch t1 t2 <*> Branch t3 t4 = Branch (t1 …Run Code Online (Sandbox Code Playgroud) 在clojure中,我经常使用以下代码:
(into [] (range 3))
Run Code Online (Sandbox Code Playgroud)
但后来我看到这个代码被使用:
(apply vector (range 3))
Run Code Online (Sandbox Code Playgroud)
这两个代码示例之间有什么区别?比另一个更习惯吗?何时使用to init集合,以及何时使用apply + factory函数?
以下 Haskell 代码无法编译:
\n\ngetMaxBound :: (Bounded a) => a -> a\ngetMaxBound _ = maxBound :: a\nRun Code Online (Sandbox Code Playgroud)\n\n我得到的错误如下:
\n\nCould not deduce (Bounded a1) arising from a use of \xe2\x80\x98maxBound\xe2\x80\x99\n from the context: Bounded a\n bound by the type signature for:\n getMaxBound :: Bounded a => a -> a\n at rot13.hs:3:1-36\nRun Code Online (Sandbox Code Playgroud)\n\n为什么我无法在 Haskell 中获取有界类型的 maxBound?
\n\n理想情况下,我会像这样使用这个函数:
\n\ngetMaxBound 3\n> 9223372036854775807\n\ngetMaxBound 'c'\n> '\\1114111'\nRun Code Online (Sandbox Code Playgroud)\n\n我觉得每次我有任何a具有 Bounded 实例的类型时,我应该能够获得该类型的 maxBound。
我缺少什么?
\n