相关疑难解决方法(0)

使用带有Scala的Eithers"for"语法

据我了解,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实例",我怎么能这样做?

monads scala typeclass either for-comprehension

40
推荐指数
3
解决办法
1万
查看次数

在方法返回类型上键入推断

当方法中使用显式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 type-inference

28
推荐指数
2
解决办法
6353
查看次数

Scala是否具有与golang相同的延迟?

Scala是否有平等的golangs推迟?

来自:http: //golang.org/doc/effective_go.html#defer

Go的defer语句调度函数调用(延迟函数),在执行defer返回的函数之前立即运行.这是处理必须释放的资源等情况的一种不寻常但有效的方法,无论函数返回哪条路径.规范示例是解锁互斥锁或关闭文件.

scala go

9
推荐指数
2
解决办法
1378
查看次数

在Scala中链接验证

我有一个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)

monads scala either

1
推荐指数
1
解决办法
1132
查看次数