人们通常说一种类型是一个单子.
在某些函数式语言和库(如Scala/Scalaz)中,您有一个类型构造函数,如List或Option,您可以定义与原始类型分离的Monad实现.所以基本上没有什么禁止你在类型系统中为同一类型的构造函数创建Monad的不同实例.
language-agnostic haskell functional-programming scala category-theory
我打算使用一个webapp,每个使用它的人都会有一个客户端可以在其计算机上运行计算(因为这些计算无法在服务器上完成,负载太多......),然后将结果发送给服务器.
我想会有很多人对我的应用程序感兴趣,这就是为什么我想知道我的架构是否良好以及我是否能够处理成千上万的人.
我计划通过JNDI使用Glassfish服务器公开远程EJB,因此1000人可以同时使用这些EJB(我猜可能有5-50个请求/秒)来检索本地计算所需的数据,然后到发送结果......
将EJB暴露给许多客户端是否昂贵?使用webservices,rmi,另一种解决方案会更好吗?
你会为我推荐的另一种架构推荐我吗?
我已经发布了很多关于Scala中的故障处理的问题,我非常感谢大家的答案.
我在处理Either和Scalaz或者理解时理解我的选择,我还有另一个(最后?)问题:
当操作处理外部非功能性世界(如DB)时,如何执行失败快速的操作序列?
我的意思是我有一个这样的方法:
def insertItem(item: Item): Either[Error,Item]
Run Code Online (Sandbox Code Playgroud)
感谢Either和这些答案,我知道如何使用以下两种方法:在Scala中使用Either和 Method参数验证链接方法调用,用于理解和monad
但是我的Itemcase类是不可变的,Right因为调用者已经有了值,所以返回它是没有意义的.
那么我怎样才能做同样的事情:
def insertItem(item: Item): Option[Error]
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,当创建用户时,我们还为他创建了一些项目.如果某个项目无法创建,则整个过程应该停止.
当我直接Option[Error]用于理解时,我认为我不会得到我期望的结果.
我想这样做是有意义的:
for {
_ <- insertItem(item1).toLeft("???").right
_ <- insertItem(item2).toLeft("???").right
_ <- insertItem(item3).toLeft("???").right
}
Run Code Online (Sandbox Code Playgroud)
但作为价值"???" 我放入我的权利永远不会有用,我想我错过了优雅的解决方案,不涉及创建永远不会使用的权利.
我想我正在寻找的东西只有在结果出现时才能继续理解None,这有点奇怪,因为我只想继续下一步操作,而不是做真正的map操作.
顺便说一句,如果可能的话,我想要非Scalaz和Scalaz解决方案.我不确定Scalaz会处理这些事情,因为它似乎更专注于真正的函数式编程,也许不提供像我的用例这样的副作用行为的代码?
我有一种方法可以促成一种方法 Optional<String>
但是,必须在另一个应用程序级别将此String解析为Integer或Long.
我有一个Function<String, Integer>可以应用于String,生成一个Integer.此转换可能会失败,因为String可能不是Integer可解析值.
我希望在转换失败时返回Optional,而不是抛出解析异常.
我无法使STRING_TO_INTEGER_FUNCTION返回null,因为Guava不允许它:
Exception in thread "main" java.lang.NullPointerException: Transformation function cannot return null.
Run Code Online (Sandbox Code Playgroud)
因此,我唯一能做的就是拥有一个,Function<String,Optional<Integer>>但后来我得到了最终的结果,Optional<Optional<Integer>>这并不是很酷,因为我可能有另一个转换应用于它.
有人知道我怎么能在番石榴做那样的事情?
Optional.of("Toto").transform(STRING_TO_INTEGER_FUNCTION) = // Optional<Integer> ?
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在努力在我的应用程序上使用蛋糕模式.
在网上找到的例子中,例子是基本的,但不涉及更复杂的需求.我想做的事情并不那么花哨:我想在蛋糕模式应用程序中使用相同类型的2个服务,使用不同的实现.
trait UserServiceComponent {
self: UserRepositoryComponent =>
val userService: UserService
class DefaultUserService extends UserService {
def getPublicProfile(id: String): Either[Error, User] = userRepository.getPublicProfile(id)
}
class AlternativeUserService extends UserService {
def getPublicProfile(id: String): Either[Error, User] = call webservice here for exemple...
}
}
trait UserService extends RepositoryDelegator[User] {
def getPublicProfile(id: String): Either[Error, User]
}
Run Code Online (Sandbox Code Playgroud)
如果我一次使用一个实现,它工作正常UserService,但如果我在同一时间需要两个实现,我真的不知道如何做到这一点.
我应该创建2个不同的组件吗?每一个都暴露出不同的userService值名称?(defaultUserService/alternativeUserService).使用一个组件进行实现我不知道其他组件在使用名称时如何能够知道使用哪个实现,userService因为我的应用程序中有2个不同的实现.
顺便说一下,当组件表达UserRepositoryComponent对它的依赖关系时,虽然并非所有实现都需要它,但我发现只有一个组件正确有点奇怪吗?想象一下,我不想构建需要两种实现的完整应用程序,但是我需要为了测试只构建不需要的AlternativeUserService,UserRepositoryComponent因为它不会提供这种依赖关系会很奇怪.用过的.
有人可以给我一些建议,以便我知道该怎么做?
一种相关问题: Cake模式:如何获取组件提供的UserService类型的所有对象
谢谢
我已经看到Enum的默认TypeAdapter不符合我的需要:
private static final class EnumTypeAdapter<T extends Enum<T>> extends TypeAdapter<T> {
private final Map<String, T> nameToConstant = new HashMap<String, T>();
private final Map<T, String> constantToName = new HashMap<T, String>();
public EnumTypeAdapter(Class<T> classOfT) {
try {
for (T constant : classOfT.getEnumConstants()) {
String name = constant.name();
SerializedName annotation = classOfT.getField(name).getAnnotation(SerializedName.class);
if (annotation != null) {
name = annotation.value();
}
nameToConstant.put(name, constant);
constantToName.put(constant, name);
}
} catch (NoSuchFieldException e) {
throw new AssertionError();
}
}
public T read(JsonReader in) throws IOException { …Run Code Online (Sandbox Code Playgroud) 假设我有一个方法允许更新DB中的某些日期:
def updateLastConsultationDate(userId: String): Unit = ???
Run Code Online (Sandbox Code Playgroud)
如何轻松地对该方法进行节流/去抖动,以使每个用户每小时运行不超过一次.
我想要最简单的解决方案,而不是基于任何事件总线,actor lib或持久层.我想要一个内存解决方案(我知道风险).
我已经看到了基于Akka Throttler的 Scala限制解决方案,但这对我来说真的很难开始使用actor来进行限制方法调用.有没有一个非常简单的方法来做到这一点?
编辑:因为它似乎不够清晰,这里是我想要的直观表示,用JS实现.正如您所看到的,限制可能不仅仅是过滤后续调用,还可以推迟调用(也称为trailing eventsjs/lodash/underscore).我正在寻找的解决方案不能仅基于纯同步代码.
我将 TS 3.4.5 与 const 断言一起使用。如何检索声明的常量数组变量的元素类型?
export type GetArrayElementType<T extends Array<any>> = T extends (infer U)[] ? U : never;
export const MyConstArray = [
'item1',
'item2',
'item3',
] as const;
export type MyConstArrayItem = GetArrayElementType<typeof MyConstArray>;
Run Code Online (Sandbox Code Playgroud)
我想有作为输出:
export type MyConstArrayItem = "item1" | "item2" | "item3"
Run Code Online (Sandbox Code Playgroud)
我不完全确定如何提取项目的类型信息,因为由于 const 断言,我的数组不再是数组类型而是一个常量元组,因此GetArrayElementType不能对其应用。
我打算在生产weblogic(10)实例上使用jmap jdk1.5工具进行堆转储.
实际上,在这个weblogic实例上部署了3个EAR(可能更多,不知道我没有访问权限).
有人告诉我"weblogic为每个EAR创建一个JVM"有人能证实吗?
使用jmap我需要jvm pid作为参数来进行堆转储...因为我有3个EAR我想我有3个pid所以我想知道如何知道哪个pid对应哪个EAR JVM?
我想更好地了解什么是快速失败和故障安全.
乍一看,我认为快速失败意味着我们希望在出现意外情况时让系统明显失败.我的意思是例如,如果工厂不能创建对象的实例,对于故障快速原则,我们真的不希望工厂返回null,或者空对象,或者部分初始化的对象,偶然可以使用正确地通过应用程序 - >大多数时候我们会有意外的行为,或者在另一个级别上提出的意外异常,这些异常不会让我们知道真正的问题是在工厂.这个原则意味着什么?
失败安全原则对我来说很难理解.Java中最常见的例子是关于集合,它们的迭代器和并发访问.据说,允许在迭代时修改列表的集合/迭代器称为故障安全.它通常通过最终迭代初始列表的副本来完成.但是在这个例子中,我并不真正了解系统失败的地方......因此,虽然它是故障安全的......失败在哪里?我们只是根据我们的需要迭代一个副本或者不重复...我没有看到与故障安全的维基定义有任何匹配...
因此,在这样的文章中:http: //www.certpal.com/blogs/2009/09/iterators-fail-fast-vs-fail-safe/ 他们快速失败,快速失败...我只是穿抓住这就是为什么我们把这个迭代称为故障安全的副本...
我在这里找到了另一个例子:http: //tutorials.jenkov.com/java-exception-handling/fail-safe-exception-handling.html 这似乎与故障安全原则的初始定义有很多关系.我认为故障安全的是,当系统出现故障时,我们必须确保故障处理程序不会失败,或者如果确实如此,则确保故障处理程序的故障不会隐藏真正的初始问题.在给定的例子中,处理程序就在初始故障代码附近,但情况并非总是如此.故障安全对我来说意味着更像我们正确处理故障处理程序中可能发生的错误或类似的事情......
因此,对我来说,这两个原则似乎并不相容.你怎么看?系统不能快速安全地失败???