我正在努力学习Scala中的类型编程,并且我发现大多数关于类型编程需要知道的东西在值编程中都有类似的对应关系,这反映在类型级编程维基页面中.但是,我没有找到this关键词或自我类型的类比.我怀疑期待这样的事情可能没有意义,但我想我会问.
例如,我可以编写以下代码来表示Booleans在运行时的值:
sealed trait BoolVal {
def not:BoolVal
def or(that:BoolVal):BoolVal
def and(that:BoolVal) =
(this.not or that.not).not
def imp(that:BoolVal) =
this.not or that
}
case object TrueVal extends BoolVal {
override val not = FalseVal
override def or(that:BoolVal) = TrueVal
}
case object FalseVal extends BoolVal {
override val not = TrueVal
override def or(that:BoolVal) = that
}
Run Code Online (Sandbox Code Playgroud)
这里我and和imp能够利用的事实,如果我是一个错误的对象或真实对象进行正确定义不要紧优势.我TrueVal和FalseVal对象可以继承相同的代码.
我可以制作类似的类型级编程结构,但我不明白如何定义And和Imp我的基本特征.
sealed trait BoolType {
type …Run Code Online (Sandbox Code Playgroud) 假设我有一个空的标记特征命名Marker,一些函数的类型参数绑定Marker:
trait Marker
object Marker {
def works[M <: Marker](m:M):M = m
def doesntWork[M <: Marker](f:M => String):String = "doesn't matter"
}
Run Code Online (Sandbox Code Playgroud)
第一个功能正如我所料.也就是说,如果传递的参数不是a Marker,则代码不会编译:
scala> works("a string")
<console>:14: error: inferred type arguments [String] do not conform to method works's type parameter bounds [M <: com.joescii.Marker]
works("a string")
^
<console>:14: error: type mismatch;
found : String("a string")
required: M
works("a string")
^
Run Code Online (Sandbox Code Playgroud)
但是,我能够将参数传递给不符合的第二个函数Marker.具体来说,我可以传递一个类型的函数,String => String代码愉快地编译并运行:
scala> doesntWork( (str:String) => "a string" ) …Run Code Online (Sandbox Code Playgroud) 感谢Martin Odersky在Coursera上的最新产品,我已经开始玩了scala.util.Try.但是,我很惊讶地发现它并不一定能很好地与集合monad一起使用,因为它没有实现scala.collection.GetTraversableOnce.
这可能会派上用场.例如,您可以将字符串列表转换为整数,同时抛弃坏的字符串,如下所示:
def ints(strs:List[String]):List[Int] = strs.flatMap(s => Try(s.toInt))
Run Code Online (Sandbox Code Playgroud)
解决方法很简单.只需将其转换Try为an Option并让其隐式转换为我们工作:
def ints(strs:List[String]):List[Int] = strs.flatMap(s => Try(s.toInt).toOption)
Run Code Online (Sandbox Code Playgroud)
在我看来,Try它将实现GenTraversableOnce或具有自己的隐式转换.谁能解释为什么不呢?事实上,这实际上Try并不是一个单子吗?
使用scalaz-stream是可以拆分/分叉然后重新加入流?
举个例子,假设我有以下功能
val streamOfNumbers : Process[Task,Int] = Process.emitAll(1 to 10)
val sumOfEvenNumbers = streamOfNumbers.filter(isEven).fold(0)(add)
val sumOfOddNumbers = streamOfNumbers.filter(isOdd).fold(0)(add)
zip( sumOfEven, sumOfOdd ).to( someEffectfulFunction )
Run Code Online (Sandbox Code Playgroud)
使用scalaz-stream,在此示例中,结果将如您所期望的那样 - 从1到10的数字元组传递到接收器.
但是,如果我们用streamOfNumbers需要IO的东西替换它,它实际上会执行两次IO动作.
使用Topic我能够创建一个正确复制流中元素的发布/订阅过程,但它不会缓冲 - 它只是尽可能快地消费整个源,而不管它的节奏接收器消耗它.
我可以将它包装在一个有界的队列中,但最终结果感觉要比它需要的复杂得多.
是否有更简单的方法在scalaz-stream中拆分流而没有来自源的重复IO操作?
我正在开发部署在AWS Elastic Beanstalk Tomcat 7容器上的Lift应用程序.使用Elastic Load Balancer时,我的应用程序需要粘性会话.
由于我的应用程序使用标准的servlet内容,因此它为JSESSIONID客户端提供cookie.我想将AWS配置为使用应用程序控制的会话粘性,在给定我的cookie名称的情况下,它将跟踪会话.但是,在Elastic Beanstalk Load Balancer配置中,我只看到配置AWS管理的cookie的能力.我想这会起作用,但我宁愿只提供一个cookie,并且粘性与会话一致,与我们在应用程序中配置它们的方式一致.
虽然看起来我们可以在与我的EB实例相关联的EC2设置中配置应用程序控制的会话粘性,但是只要我们在EB控制台中进行更改,我们应用的设置就会被破坏.这不是非常令人惊讶的行为,但我希望我们很快就会忘记这种行为并意外地消除我们的设置.
有谁知道是否有可能使粘性变粘?:)
cookies session amazon-web-services tomcat7 amazon-elastic-beanstalk
我正在尝试更新Windows注册表以为我的自定义文件扩展名添加图标,到目前为止我还没有成功.我当前的版本最接近这个stackoverflow问题.不幸的是,我的文件图标仍然是通用的内置Windows图标之一(见下面的截图).
在这一点上,我最好的猜测可能是我的.ICO文件有问题.我在Dropbox上分享了它
这是我正在进行的完整注册表更新regedit.如您所见,我还将文件扩展名与.bat文件关联以便执行.这很好用.此外,Windows资源管理器中显示的类型是PartQuest Archive,它也很棒(参见上面的屏幕截图).唉,图标的最后一个条目没有骰子.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\pqunzip]
@="PartQuest Archive"
[HKEY_CLASSES_ROOT\pqunzip\shell]
[HKEY_CLASSES_ROOT\pqunzip\shell\open]
[HKEY_CLASSES_ROOT\pqunzip\shell\open\command]
@="\"C:\\MentorGraphics\\PartQuestTools\\SDD_HOME\\common\\win32\\scripts\\pqunzip.bat\" \"%1\""
[HKEY_CLASSES_ROOT\.pqz]
@="pqunzip"
[HKEY_CLASSES_ROOT\.pqz\DefaultIcon]
@="\"C:\\MentorGraphics\\PartQuestTools\\SDD_HOME\\common\\win32\\config\\decrypted.ico\""
Run Code Online (Sandbox Code Playgroud)
我还尝试,1在文件名末尾添加一个文件名,因为.ICO文件中可能有两个图标嵌入其中.这没有什么区别.
为了更好的衡量,我在每次更改后都重新启动.我不确定这是否有必要.
来自Windows专家的任何提示肯定会受到赞赏!
上周,我们更改了 CI 服务器上的用户目录权限,我们不再拥有对用户主目录的写访问权限。因此 sbt 无法启动,因为它无法~/.ivy使用以下堆栈跟踪写入 etc。
java.io.IOException: No such file or directory
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:1006)
at xsbt.boot.Locks$.apply0(Locks.scala:34)
at xsbt.boot.Locks$.apply(Locks.scala:28)
at xsbt.boot.Launch.locked(Launch.scala:238)
at xsbt.boot.Launch.app(Launch.scala:147)
at xsbt.boot.Launch.app(Launch.scala:145)
at xsbt.boot.Launch$.run(Launch.scala:102)
at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:35)
at xsbt.boot.Launch$.launch(Launch.scala:117)
at xsbt.boot.Launch$.apply(Launch.scala:18)
at xsbt.boot.Boot$.runImpl(Boot.scala:41)
at xsbt.boot.Boot$.main(Boot.scala:17)
at xsbt.boot.Boot.main(Boot.scala)
Error during sbt execution: java.io.IOException: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我知道我们可以设置一些 sbt 变量,例如引导目录。我还没有找到我们可以配置的所有变量的明确列表,否则默认为用户 home 的子目录。我也没有找到设置默认根目录的方法,这反过来会影响所有这些变量。
谁能指出如何配置 sbt 使其不使用用户的主目录来存放任何文件?
我想将两个scalaz流与一个谓词结合起来,该谓词从任一流中选择下一个元素.例如,我希望这个测试通过:
val a = Process(1, 2, 5, 8)
val b = Process(3, 4, 5, 7)
choose(a, b)(_ < _).toList shouldEqual List(1, 2, 3, 4, 5, 5, 7, 8)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我们不能做一些聪明的事情zip并订购这两个元素,因为有时可能会连续选择其中一个过程.
我抓住了一个我认为会起作用的解决方案.它汇编了!但该死的,如果它什么都不做.JVM只是挂起:(
import scalaz.stream.Process._
import scalaz.stream._
object StreamStuff {
def choose[F[_], I](a:Process[F, I], b:Process[F, I])(p: (I, I) => Boolean): Process[F, I] =
(a.awaitOption zip b.awaitOption).flatMap {
case (Some(ai), Some(bi)) =>
if(p(ai, bi)) emit(ai) ++ choose(a, emit(bi) ++ b)(p)
else emit(bi) ++ choose(emit(ai) ++ a, b)(p)
case (None, Some(bi)) => emit(bi) …Run Code Online (Sandbox Code Playgroud) 我正在使用Scala 2.10.4和akka 2.3.4.我遇到了类型推断不符合我预期的问题.
下面的代码说明了我遇到的一个例子.我有一个案例类,用一个id命名包装消息MyMessage.它使用消息类型进行参数化.然后我有一个名为的MyPayload包含一个的有效负载String.
在一个actor(这里我只是使用一个名为的常规对象,MyObject因为问题不是akka特有的)我是模式匹配并调用一个对我的有效负载类型进行操作的函数MyPayload.
package so
case class MyMessage[T](id:Long, payload:T)
case class MyPayload(s:String)
object MyObject {
def receive:PartialFunction[Any, Unit] = {
case m @ MyMessage(id, MyPayload(s)) =>
// Doesn't compile
processPayload(m)
// Compiles
processPayload(MyMessage(id, MyPayload(s)))
}
def processPayload(m:MyMessage[MyPayload]) = {
println(m)
}
}
Run Code Online (Sandbox Code Playgroud)
由于我不明白的原因,使用模式修补@和未应用的case类不会推断出类型参数MyMessage[T].在上面的代码中,我原本预计m会有类型MyMessage[MyPayload].但是,当我编译时,它认为类型是MyMessage[Any].
[error] PatternMatch.scala:9: type mismatch;
[error] found : so.MyMessage[Any]
[error] required: so.MyMessage[so.MyPayload]
[error] Note: …Run Code Online (Sandbox Code Playgroud)