据我了解,Scala"for"语法与Haskell的monadic"do"语法非常相似.在Scala中,"for"语法通常用于Lists和Options.我想将它与Eithers 一起使用,但默认导入中不存在必要的方法.
for {
foo <- Right(1)
bar <- Left("nope")
} yield (foo + bar)
// expected result: Left("nope")
// instead I get "error: value flatMap is not a member..."
Run Code Online (Sandbox Code Playgroud)
这个功能是通过一些导入提供的吗?
有一个轻微的障碍:
for {
foo <- Right(1)
if foo > 3
} yield foo
// expected result: Left(???)
Run Code Online (Sandbox Code Playgroud)
对于列表,它将是List().因为Option,它会None.Scala标准库是否为此提供了解决方案?(或许scalaz?)怎么样?假设我想为Either提供我自己的"monad实例",我怎么能这样做?
当方法中使用显式return语句时,为什么Scala无法推断方法的返回类型?
例如,为什么以下代码编译?
object Main {
def who = 5
def main(args: Array[String]) = println(who)
}
Run Code Online (Sandbox Code Playgroud)
但以下情况并非如此.
object Main {
def who = return 5
def main(args: Array[String]) = println(who)
}
Run Code Online (Sandbox Code Playgroud) Scala是否有平等的golangs推迟?
来自:http: //golang.org/doc/effective_go.html#defer
Go的defer语句调度函数调用(延迟函数),在执行defer返回的函数之前立即运行.这是处理必须释放的资源等情况的一种不寻常但有效的方法,无论函数返回哪条路径.规范示例是解锁互斥锁或关闭文件.
我有一个case class包含命令行配置信息的Scala :
case class Config(emailAddress: Option[String],
firstName: Option[String]
lastName: Option[String]
password: Option[String])
Run Code Online (Sandbox Code Playgroud)
我正在编写一个验证函数来检查每个值是否为Some:
def validateConfig(config: Config): Try[Config] = {
if (config.emailAddress.isEmpty) {
Failure(new IllegalArgumentException("Email Address")
} else if (config.firstName.isEmpty) {
Failure(new IllegalArgumentException("First Name")
} else if (config.lastName.isEmpty) {
Failure(new IllegalArgumentException("Last Name")
} else if (config.password.isEmpty) {
Failure(new IllegalArgumentException("Password")
} else {
Success(config)
}
}
Run Code Online (Sandbox Code Playgroud)
但如果我理解来自Haskell的monad,似乎我应该能够将验证链接在一起(伪语法):
def validateConfig(config: Config): Try[Config] = {
config.emailAddress.map(Success(config)).
getOrElse(Failure(new IllegalArgumentException("Email Address")) >>
config.firstName.map(Success(config)).
getOrElse(Failure(new IllegalArgumentException("First Name")) >>
config.lastName.map(Success(config)).
getOrElse(Failure(new IllegalArgumentException("Last Name")) …Run Code Online (Sandbox Code Playgroud)