在Monad中定义多个flatMap(或>>=/ bind在Haskell中)方法是否有意义?极少数单子我实际使用(Option,Try,Either投影)只定义一个flatMap方法.
例如,定义一个flatMap方法Option可以生成一个函数Try吗?那么这样Option[Try[User]]就会被夷为平地Option[User]?(考虑失去异常不是问题......)
或者monad应该只定义一个flatMap方法,采用产生相同类型monad的函数?我想在这种情况下,Either预测不会是monad?是吗?
我正在寻找的是某种程度上相当于在SQL中做:
WHERE 1 = 0
Run Code Online (Sandbox Code Playgroud)
我正在寻找这样的东西,因为我正在构建一个类型安全的DSL来对我的域执行查询,支持连接和析取.有时,添加一个永远不匹配任何内容的查询可能更容易,而不是在代码中处理它.
例如,在我的用例中:
StampleFilters().underCategoryIds(sharedCategoryIds.toList)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它不能按预期工作,因为它sharedCategoryIds是空的,因此它会导致查询$(),但不会过滤任何内容.对于一个空列表,我宁愿构建一个永远不会返回任何内容的查询.
有没有一种简单的方法来做这样的事情,对表演没有任何影响?
我可能会添加一些查询,{ somefield: unexistingvalue }但我想知道是否没有更好的.
编辑
我希望表达式是可组合的.我的意思是它应该在查询中工作,例如$or(exp1,exp2,exp3)在哪里例如exp1永远不匹配的表达式.
如果您有任何建议,那么解释为什么一个比其他人更好以及它如何影响查询引擎性能(或不是)会更好
我不明白 NumberFormat 是如何工作的。
在法国,我们从不使用$US,为什么我会得到以下信息?
new Intl.NumberFormat("fr-FR",{
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2,
}).format("345")
"345,00 $US"
new Intl.NumberFormat("fr-FR",{
style: 'currency',
currency: 'EUR',
minimumFractionDigits: 2,
}).format("345")
"345,00 €"
Run Code Online (Sandbox Code Playgroud)
另外:以下对我来说也没有任何意义。我尝试了随机语言环境来查看影响并为这两个获得不同的结果:
new Intl.NumberFormat("en-HOS",{
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2,
}).format("345")
"345,00 $US"
new Intl.NumberFormat("en-HOSSDDG",{
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2,
}).format("345")
"$345.00"
Run Code Online (Sandbox Code Playgroud)
这个 API 是坏的还是我错过了什么?
在第一次访问网站时,是否可以通过GET请求知道浏览器cookie是否已激活?
特别是在J2EE上下文中是否可能?在服务器端(没有ajax/js解决方案)
/**
* @author Sebastien Lorber <i>(lorber.sebastien@gmail.com)</i>
*/
public enum EnumDeviceType {
ANDROID {
@Override
public boolean validateDeviceIdentifier(String deviceIdentifier) {
Preconditions.checkArgument( !Strings.isNullOrEmpty(deviceIdentifier) );
return ANDROID_REGISTRATION_ID_PATTERN.matcher(deviceIdentifier).matches();
}
},
IOS {
@Override
public boolean validateDeviceIdentifier(String deviceIdentifier) {
Preconditions.checkArgument( !Strings.isNullOrEmpty(deviceIdentifier) );
return IOS_DEVICE_TOKEN_PATTERN.matcher(deviceIdentifier).matches();
}
},
;
// TODO how do we validate registration Ids
public static final Pattern ANDROID_REGISTRATION_ID_PATTERN = Pattern.compile(".*");
// IOS device token is a 64 HEX string
public static final Pattern IOS_DEVICE_TOKEN_PATTERN = Pattern.compile("[a-fA-F0-9]{64,64}");
public abstract boolean validateDeviceIdentifier(String deviceIdentifier);
public boolean …Run Code Online (Sandbox Code Playgroud) 相关问题: 与Java内部类相比,Scala闭包 - >最终VS var
我想知道Scala什么时候将捕获的变量放在堆上而不是堆栈中.我正在阅读马丁奥德斯基的Scala书,但现在我没有找到这些信息.有人可以解释引擎盖后面的内容吗?
我不明白如何在注释处理器中检索枚举值.
我的注释是一个自定义Java Bean验证注释:
@StringEnumeration(enumClass = UserCivility.class)
private String civility;
Run Code Online (Sandbox Code Playgroud)
在我的注释处理器上,我可以访问这些实例:
javax.lang.model.element.AnnotationValue
javax.lang.model.type.TypeMirror
javax.lang.model.element.TypeElement
Run Code Online (Sandbox Code Playgroud)
我知道它包含有关我的枚举的数据,因为我可以在调试模式下看到它.我也看到了ElementKind == Enum
但我想得到Enum的所有名字,请有人帮助我.
编辑:我无法访问此枚举的Class对象,因为我们在一个注释处理器中,而不是标准的Java反射代码.所以我不能打电话Class#getEnumConstants()或EnumSet.allOf(MyEnum.class)除非你告诉我如何从上面提到的类型中获取Class对象.
我有一个非常简单的配置:
//lazy val bananaRdfProject = RootProject( uri("git://github.com:stample/banana-rdf.git#"+bananaGitBranch) )
// lazy val bananaRdfProject = RootProject( uri("https://github.com/stample/banana-rdf.git#"+bananaGitBranch) )
// lazy val bananaRdfProject = ProjectRef( uri("https://github.com/stample/banana-rdf.git#"+bananaGitBranch) ,"banana-rdf")
lazy val bananaRdfProject = RootProject( file("../banana-rdf") )
lazy val main = play.Project(appName, appVersion, appDependencies).settings(...)
.dependsOn( bananaRdfProject )
Run Code Online (Sandbox Code Playgroud)
我尝试使用上面4个不同的项目声明bananaRdfProject.
由于我可以在本地编辑这个banana-rdf,我希望每次构建我的play项目时都要重新编译它,这样我就不必发布banana-rdf ...
但是当我尝试编译我的主要游戏项目时,它使用banana-rdf,它不编译banana-rdf,而是尝试编译主项目:编译失败,因为类路径中缺少banana-rdf类.
sebastien@clemence-XPS-L412Z:rww-play (master *%)$ ./play.old/play
[info] Loading project definition from /home/sebastien/Bureau/rww-play/project
[warn] there were 1 deprecation warning(s); re-run with -deprecation for details
[warn] one warning found
[info] Loading project definition from /home/sebastien/Bureau/banana-rdf/project
[info] Updating {file:/home/sebastien/Bureau/banana-rdf/project/}banana-rdf-build...
[info] …Run Code Online (Sandbox Code Playgroud) /** When this future is completed, either through an exception, or a value,
* apply the provided function.
*
* If the future has already been completed,
* this will either be applied immediately or be scheduled asynchronously.
*
* $multipleCallbacks
* $callbackInContext
*/
def onComplete[U](func: Try[T] => U)(implicit executor: ExecutionContext): Unit
Run Code Online (Sandbox Code Playgroud)
基本用法似乎是:
result.onComplete({
case Success(listInt) => {
//Do something with my list
}
case Failure(exception) => {
//Do something with my error
}
})
Run Code Online (Sandbox Code Playgroud)
这个函数似乎对产生副作用很有用,因为它返回Unit(就像记录完成一样)我不明白这个U函数返回的是什么类型.我们提供的函数的返回类型是否真的有用?它是如何被Scala使用的?
同样的问题也适用于onSuccess …
大多数时候,我不喜欢Javascript,更喜欢严格的编译语言,如Scala,Java,Haskell ......
但是,使用Javascript可以很好的一件事是能够轻松更改外部依赖项的代码.例如,如果你有一个bug并且你认为它是你的依赖库之一,你可以轻松地通过你自己的覆盖来交换库方法并检查它是否更好.你甚至可以为Array ou String原型和类似的东西添加方法...... node_modules如果他愿意的话,甚至可以暂时去改变库代码.
在JVM世界中,这对我来说似乎是一个繁重的过程:
这是一种痛苦,我只是不想在一年内多做一次今天我试图修复我的应用程序中的错误,并且lib没有提供足够的信息.我本来希望能够将一个Logger放在该lib的一行上,以便更好地了解发生了什么,但我试图破解调试器但没有成功(无论如何,这个bug在我的计算机上无法再现... .)
是否有任何简单的替代方法可以快速更改依赖项的代码?
我会对Scala,Java,Clojure或任何其他JVM语言的任何解决方案感兴趣.
我不是在寻找可生产部署的解决方案,只是一种在本地使用并最终可在测试环境中部署的快速解决方案.
编辑:我在谈论库内部,不打算由库作者修改.请假设要更改的类是最终的,不能由库配置替换,也不能以任何方式注入库中.
scala ×5
java ×4
android ×1
android-c2dm ×1
annotations ×1
asynchronous ×1
banana-rdf ×1
clojure ×1
cookies ×1
currency ×1
future ×1
haskell ×1
intl ×1
jar ×1
java-ee ×1
javascript ×1
maven ×1
monads ×1
mongodb ×1
sbt ×1