我的scala应用程序只能运行Java 7,因为它依赖于只出现在该版本的JDK中的库.
如何在sbt中强制执行该操作,以便在启动sbt运行/编译应用程序时使用错误版本的Java时,会立即向用户显示正确的错误消息?
注意:此处无编译Java™源代码.我只有 Scala源代码.Scala代码需要import java.nio.file.Path
Java 7提供的代码.
有没有办法将Seq [Future [X]]变成枚举器[X]?用例是我想通过抓取网络来获取资源.这将返回一个期货序列,我想返回一个枚举器,它将按照它们首次完成的顺序推送到Iteratee.
看起来Victor Klang的Future select gist可以用来做到这一点 - 尽管看起来效率很低.
注意:有问题的Iteratees和Enumerator是play框架版本2.x给出的,即具有以下导入: import play.api.libs.iteratee._
阅读了这本书,了解了一本Haskell For Great Good,以及非常有用的维基书籍Haskell分类理论帮助我克服了将类别对象与编程对象混淆的常见类别错误,我仍然有以下问题:
为什么必须fmap
映射List的每个元素?
我喜欢它,我只想理解这在理论上是如何合理的.(或者更容易证明使用HoTT?)
在Scala表示法中,List
是一个仿函数,它接受任何类型并将其映射到所有列表类型集合中的类型,例如,它将类型映射Int
到类型List[Int]
,并将函数映射到Int
例如
Int.successor: Int => Int
至 Functor[List].fmap(successor) : List[Int] => List[Int]
Int.toString: Int => String
至 Functor[List].fmap(toString): List[Int] => List[String]
现在每个实例List[X]
都是一个带有empty
函数(mempty
在Haskell中)和combine
函数(mappend
在Haskell中)的monoid .我的猜测是,人们可以使用列表是Monoids的事实,以表明map
必须映射列表的所有元素.我的感觉是,如果添加了pure
Applicative的函数,这给了我们一个只包含其他类型元素的列表.例如Applicative[List[Int]].pure(1) == List(1)
.因为map(succ)
在这些元素上给我们带有下一个元素的单例列表,所以这涵盖了所有这些子集.然后我想combine
所有这些单身人士的功能都会给我们列出所有其他元素.不知怎的,我想这限制了地图的工作方式.
另一个暗示性的论点是map
必须在列表之间映射函数.由于a中的每个元素List[Int]
都是Int类型,并且如果一个映射到List[String]
一个元素必须映射它的每个元素,或者一个元素不是正确的类型.
所以这两个论点似乎都指向了正确的方向.但我想知道剩下的方式需要什么.
反例? …
有人发现 Setoids 被广泛用于 Agda、Coq 等语言中……事实上,Lean 等语言认为它们可以帮助避免“Setoid Hell”。首先使用 Setoids 的原因是什么?转向基于 HoTT(如立方体 Agda)的外延类型理论是否减少了对 Setoids 的需求?
Haskell和Scala社区最近对他们所谓的无标签最终编程“模式” 非常着迷。这些被称为初始自由代数的对偶,所以我想知道Tagless Final是最终的。在ncatlab上,仅能找到最终的代数,而不是最终的代数。
问一个问题什么是无标签的最终代数最终在 CS-理论栈交换中,我得到了一个很好的答案,指向此博客文章《最终代数语义是观察上的等效性》。因此,这些确实是最终代数,但与初始代数不在同一类代数中。
然而,当我们看看如何最终无标签的使用,我们发现,这是很经常应用于东西看起来像余代数。例如,请参阅Scala中使用Tagless-Final管理效果的虚假希望的第1部分中a Console
或a 的两个示例。UserRepository
因此,看起来像代数论一样,它并没有F
像在分类论中用endofunctors 形式表达的代数作为形式的映射F(X) ? X
那样,而是像许多final tagless
与Coalgebras 一样使用,它们是映射X ? F(X)
,并表示过程。这些真的是同一回事吗?还是这里发生了其他事情?
让我们从Olivier Blanvillain的Scala译文中对最终无标签的解释开始,这些范例摘自Haskell的课程。一个人注意到这始于一个代数数据类型,它确实是一个代数结构的原型:一个组。
在类别中,可以用多项式函子构建一个组,该多项式函子
F[X] = X×X + X + 1
可以将任意类型的类型作为该类型对或该类型对或1的类型。然后为X选择一个特定类型,例如A代数是一个函数F[A] ? A
。最广为人知的组是正负自然数的集合,0表示?,因此我们的代数为:
?×? + ? + 1 ? ?
Run Code Online (Sandbox Code Playgroud)
代数可以被分解成3个功能+: ?×? ? ?
,-: ? ? ?
和常数zero: 1 …
oop functional-programming scala category-theory tagless-final
我在scala 2.10项目中使用sbt-idea工作时遇到了很多麻烦.
我尝试sbt-idea
从它的git repo 编译,确保已经设置
scalaVersion := "2.10.0-RC5"
Run Code Online (Sandbox Code Playgroud)
in build/Build.scala
,并使用publish-local
命令在git中编译它.但我仍然坚持下去
[error] sbt.IncompatiblePluginsException: Binary incompatibility in plugins detected.
Run Code Online (Sandbox Code Playgroud)
当我在我发布的版本中使用它时,简单地说添加
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.3.0-SNAPSHOT")
Run Code Online (Sandbox Code Playgroud)
到project/plugins.sbt
文件.
我有一个100%https的Web服务器,可以进行TLS重新协商.这非常有用,因此用户可以在单击登录按钮并询问其客户端证书之前访问该站点并获取一些不错的页面.下面是执行X509Cert类的重新协商行213-236的代码部分
import org.jboss.netty.handler.ssl.SslHandler
val sslh = r.underlying.context.getPipeline.get(classOf[SslHandler])
trySome(sslh.getEngine.getSession.getPeerCertificates.toIndexedSeq) orElse {
if (!fetch) None
else {
sslh.setEnableRenegotiation(true) // todo: does this have to be done on every request?
r match {
case UserAgent(agent) if needAuth(agent) => sslh.getEngine.setNeedClientAuth(true)
case _ => sslh.getEngine.setWantClientAuth(true)
}
val future = sslh.handshake()
future.await(30000) //that's certainly way too long.
if (future.isDone && future.isSuccess)
trySome(sslh.getEngine.getSession.getPeerCertificates.toIndexedSeq)
else
None
}
}
Run Code Online (Sandbox Code Playgroud)
现在我期待一旦有人使用X509客户端证书进行身份验证,会话将持续一段时间并记住证书链 - 比如10分钟或更长时间,并且在任何情况下至少1分钟.实际上,这就是为什么我可以选择在变量"fetch"设置为false的情况下调用上述方法.我希望如果有人认证连接不需要重新协商.
但是我注意到在大多数浏览器上,如果我想获得会话并返回X509证书,我每次都需要调用sslh.handshake().如果"fetch"设置为false,那么我大部分都会返回None.
这是正常的,还是我做错了什么?
PS.
我正在编写一个 Web 服务器,并试图确保尽可能高效,最大限度地减少文件系统调用。问题是返回 Streams 的方法,例如java.nio.file.Files.list返回 Stream of Paths
,我想要一个 Stream of BasicFileAttributes,这样我就可以返回每个 Path 的创建时间和更新时间(关于返回LDP Container的结果)。
当然,一个简单的解决方案是使用map
一个函数来处理 Stream 的每个元素,该函数接受路径并返回文件属性(p: Path) => Files.getAttributeView...
,但这听起来像是会为每个 Path 调用 FS,这看起来很浪费,因为要获取JDK中的文件信息不可能与属性信息相差太远。
实际上,我在2009 年 OpenJDK 邮件列表中看到了这封邮件,其中指出他们已经讨论了添加一个将返回一对路径和属性的 API...
我在 JDK 上发现了一个非公共类java.nio.file.FileTreeWalker
,它有一个 api,允许人们获取属性FileTreeWalker.Event
。这实际上利用了sun.nio.fs.BasicFileAttributesHolder
允许路径保存属性的缓存。但它不是公开的,也不清楚它在哪里发挥作用。
当然还有整个FileVisitor API,它具有返回 aPath
和 的方法BasicFileAttributes
,如下所示:
public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {...}
Run Code Online (Sandbox Code Playgroud)
所以我正在寻找是否有一种方法可以将其变成一个 Stream,它尊重Akka推动的Reactive Manifesto的背压原则,而不占用太多资源。我检查了开源Alpakka File项目,但这也正在流式传输返回s 的方法...Files
Path