相关疑难解决方法(0)

Scala选项:地图与模式匹配

Option在Scala 处理时,我应该考虑哪些事情来决定是映射还是模式匹配?例如,如果我有Option[MyClass],我可以通过以下方式处理它:

def getList(myOptionInstance: Option[MyClass]): List[String] =
  myOptionInstance map (...) getOrElse(List.empty[String])
Run Code Online (Sandbox Code Playgroud)

要么

def getList(myOptionInstance: Option[MyClass]): List[String] = myOptionInstance match {
  case Some(mySomeInstance) => .....
  case None => List.empty[String]
}
Run Code Online (Sandbox Code Playgroud)

我何时会选择一个而不是另一个?

scala

13
推荐指数
2
解决办法
1万
查看次数

在Scala中实现ifTrue,ifFalse,ifSome,ifNone等,以避免if(...)和简单的模式匹配

在Scala中,我逐渐失去了以控制流方式思考的Java/C习惯,并且习惯于继续前进并首先得到我感兴趣的对象,然后通常应用类似a match或a map()foreach()for的东西.集合.我非常喜欢它,因为它现在感觉像构建我的代码更自然,更直接的方式.

渐渐地,我希望我能以相同的方式为条件编程; 即,首先获得一个布尔值,然后match它做各种事情.match然而,对于这项任务来说,全面而言似乎有点过分.

相比:

obj.isSomethingValid match {
  case true => doX
  case false => doY
}
Run Code Online (Sandbox Code Playgroud)

与我更接近Java的风格相比:

if (obj.isSomethingValid)
  doX
else
  doY
Run Code Online (Sandbox Code Playgroud)

然后我想起了Smalltalk ifTrue:ifFalse:消息(及其变体).可以在Scala中写这样的东西吗?

obj.isSomethingValid ifTrue doX else doY
Run Code Online (Sandbox Code Playgroud)

与变种:

val v = obj.isSomethingValid ifTrue someVal else someOtherVal

// with side effects
obj.isSomethingValid ifFalse {
  numInvalid += 1
  println("not valid")
}
Run Code Online (Sandbox Code Playgroud)

此外,这种风格可以用于简单的两种类型Option吗?我知道使用更习惯的方法Option是把它作为一个集合和呼叫filter(),map(),exists()就可以了,但往往在最后,我发现我需要执行一些doX,如果它被定义,有的doY如果事实并非如此.就像是:

val …
Run Code Online (Sandbox Code Playgroud)

scala match control-flow

7
推荐指数
2
解决办法
2747
查看次数

Scala的选项以什么方式折叠了一个变形?

这个问题的答案表明,Scala中Option的fold方法是一种catamoprhism.从维基百科中,一个catamophism是"从初始代数到其他代数的独特同态.这个概念已经应用于函数式编程作为折叠".所以这似乎是公平的,但引导我将初始代数作为F-代数类别中的初始对象.

因此,如果Option上的折叠实际上是一个catamophism,那么需要有一些仿函数F来创建F代数的类别,其中Option将是初始对象.我无法弄清楚这个仿函数是什么.

对于类型列表,A仿函数FF[X] = 1 + A * X.这是有道理的,因为List是一个递归数据类型,所以如果X是,List[A]那么上面读取的类型列表A是空列表(1),或(+)a 和a的一对(*).但Option不是递归的.只会(没什么或一个).所以我没看到仿函数在哪里.AList[A]Option[A]1 + AA

只是要清楚,我认识到,期权已经是一个仿函数,因为它需要AOption[A],但是什么名单做是不同的,A是固定的,仿函数是用来描述如何构建递归的数据类型.

在一个相关的说明中,如果它不是一个catamorphism它可能不应被称为折叠,因为这会导致一些混乱.

scala category-theory catamorphism scala-option recursion-schemes

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