只要我们有一个PartialFunction[X,R]很容易将它转换为返回的函数Option[R],例如
def pfToOptf[X, R](f: PartialFunction[X,R])(x: X) =
if (f.isDefinedAt(x)) Some(f(x))
else None
Run Code Online (Sandbox Code Playgroud)
但是,如果任务相反,那该怎么办:假设我有一个函数作为参数f获取X并返回Option[R]结果.我想做出一个PartialFunction[X,R].什么是最好的方法?
我想出来的东西看起来很丑陋我的口味:
def optfToPf[X,R](f: X => Option[R]) : PartialFunction[X,R] = {
object extractor {
def unapply(x: X): Option[R] = f(x)
}
{ case extractor(r) => r }
}
Run Code Online (Sandbox Code Playgroud)
我错过了一些更好的方法吗?
我正在尝试编写一个函数,当它们以通用方式包装在Option中时,重用我对Object A - > Object B的隐式转换,以便Option [A] - > Option [B]转换也工作.
我想出的是:
implicit def fromOptionToOption[A, B](from: Option[A])(implicit conversion: (A) => B): Option[B] = from.map(conversion(_))
Run Code Online (Sandbox Code Playgroud)
当我将一个(..)分配给一个值而不是当我分配一个Option val时,这是有效的; 请参阅以下控制台输出:
scala> trait T
defined trait T
scala> case class Foo(i: Int) extends T
defined class Foo
scala> case class Bar(i: Int) extends T
defined class Bar
scala> implicit def fromFooToBar(f: Foo):Bar = Bar(f.i)
fromFooToBar: (f: Foo)Bar
scala> implicit def fromBarToFoo(b: Bar):Foo = Foo(b.i)
fromBarToFoo: (b: Bar)Foo
scala> implicit def fromOptionToOption[A, B](from: Option[A])(implicit conversion: …Run Code Online (Sandbox Code Playgroud) 这基本上是为了包装java工厂方法,如果无法根据输入创建项目,则抛出异常.我正在寻找基础库中的东西,如:
def exceptionToOption[A](f: => A):Option[A] ={
try{
Some(f)}
catch{
case e:Exception => None}
}
Run Code Online (Sandbox Code Playgroud)
用法:
val id:Option[UUID] = exceptionToOption(UUID.fromString("this will produce None"))
Run Code Online (Sandbox Code Playgroud)
我知道我可以自己写,但我想检查一下,我不是在重新发明轮子.
如何(最好)将方法调用返回的选项转换为Try(优先级,尽管Either或scalaz \/甚至验证可能没问题),包括在适当的情况下指定Failure值?
例如,我有以下代码,感觉很笨,但至少做(大部分)工作:
import scala.util._
case class ARef(value: String)
case class BRef(value: String)
case class A(ref: ARef, bRef: BRef)
class MismatchException(msg: String) extends RuntimeException(msg)
trait MyTry {
// Given:
val validBRefs: List[BRef]
// Want to go from an Option[A] (obtained, eg., via a function call passing a provided ARef)
// to a Try[BRef], where the b-ref needs to be checked against the above list of BRefs or fail:
def getValidBRefForReferencedA(aRef: ARef): Try[BRef] = {
val abRef = for { …Run Code Online (Sandbox Code Playgroud) Scala中是否存在预定义函数x,它将2个选项组合在一起
Some(a) x None => Some(a)
None x Some(b) => Some(b)
None x None => None
Run Code Online (Sandbox Code Playgroud) 如何快速创建一个List[Int]包含1到100的内容?
我试过了List(0 to 100),但它回来了List[Range.Inclusive]
谢谢
Option可以隐式转换为Iterable- 但为什么它不只是直接实现Iterable:
def iterator = new Iterator[A] {
var end = !isDefined
def next() = {
val n = if (end) throw new NoSuchElementException() else get
end = true
n
}
def hasNext = !end
}
Run Code Online (Sandbox Code Playgroud)
编辑: 事实上它甚至比那更糟糕,因为在2.8 Option中声明了一个iterator方法:
def iterator: Iterator[A] =
if (isEmpty) Iterator.empty else Iterator.single(this.get)
Run Code Online (Sandbox Code Playgroud) 目前我正在使用此代码
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" "Test/Settings.bundle/Root.plist"
Run Code Online (Sandbox Code Playgroud)
在构建阶段的脚本部分中,将产品版本放在应用程序设置的只读字段中.该字段具有首选项数组的位置1(从0开始).
我问是否有可能使用更强大的1来访问该字段,因为我或其他开发人员在开发过程中可能会意外地改变位置.
我可以访问该元素,指定它的标识符,无论其位置如何?
为了更好地解释我的需求,我写下了一个例子.我需要把像1.2.345进入string第2节点dict的array即我需要从改变0.0.0到1.2.345.是否可以访问dict节点而不说明它是数组中的第二个?我要求在PlistBuddy中使用类似于xpath表达式的东西(如果有的话).
<?xml version="1.0" encoding="UTF-8"?>
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Title</key>
<string>Application info</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<string>0.0.0</string>
<key>Key</key>
<string>version</string>
<key>Title</key>
<string>Version</string>
<key>Type</key>
<string>PSTitleValueSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<string>0</string>
<key>Key</key>
<string>build</string>
<key>Title</key>
<string>Build</string>
<key>Type</key>
<string>PSTitleValueSpecifier</string>
</dict>
...
Run Code Online (Sandbox Code Playgroud) 我有一个列表l:List[T1],目前我正在做以下事情:
myfun : T1 -> Option[T2]
val x: Option[T2] = l.map{ myfun(l) }.flatten.find(_=>true)
Run Code Online (Sandbox Code Playgroud)
该myfun函数返回None或Some,flatten抛弃所有None,并且find返回列表的第一个元素(如果有的话).
这对我来说似乎有些苛刻.我认为可能存在一些理解或类似的东西会减少浪费或更聪明.例如:我不需要如有后续的答案myfun返回任何 Some在map列表中l.