我想让applycase类的自动伴侣类构造函数为我执行隐式转换,但无法弄清楚如何这样做.我一直在搜索,我能找到的最接近的答案就是这个问题(我将解释为什么它不是我正在寻找的).
我有一个类似于下面的案例类:
case class Container(a: Long, b: Long, c: Long)
Run Code Online (Sandbox Code Playgroud)
我正在使用容器来计算某些条件适用的实例,所以我希望能够让构造函数自动将布尔参数转换为longs(if (boolean) 1L else 0L).
当然,真实的案例类有很多参数,因此制作我自己的伴随对象和重载apply接受Boolean参数会很繁琐且非常重复.此外,类似下面的代码是不理想的(如果它以某种方式正确实现),因为它只接受布尔参数:
object Container {
def apply(args: Boolean*) = {
// doesn't REALLY work since number of arguments not enforced
Container(args map { if (_) 1L else 0L } toArray: _*)
}
}
val c1 = Container(1, 0, 1) // works
val c2 = Container(true, false, true) // might be workable if done correctly
val c3 …Run Code Online (Sandbox Code Playgroud) 我正在使用Rust中的二进制序列化和反序列化,并注意到二进制反序列化比使用Java慢几个数量级.为了消除由于例如分配和开销导致的开销的可能性,我只是从每个程序中读取二进制流.每个程序从磁盘上的二进制文件读取,该文件包含一个包含输入值数量的4字节整数,以及一个8字节大端IEEE 754编码浮点数的连续块.这是Java实现:
import java.io.*;
public class ReadBinary {
public static void main(String[] args) throws Exception {
DataInputStream input = new DataInputStream(new BufferedInputStream(new FileInputStream(args[0])));
int inputLength = input.readInt();
System.out.println("input length: " + inputLength);
try {
for (int i = 0; i < inputLength; i++) {
double d = input.readDouble();
if (i == inputLength - 1) {
System.out.println(d);
}
}
} finally {
input.close()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是Rust的实现:
fn main() {
use std::os;
use std::io::File;
use std::io::BufferedReader;
let …Run Code Online (Sandbox Code Playgroud) Scala或Scalaz中是否存在将容器/函数集合转换为从同一输入映射到集合输出值的函数的实用程序?签名看起来像
def transform[M[_], A, B](m: M[A => B]): A => M[B] = ???
Run Code Online (Sandbox Code Playgroud)
这是List容器的示例实现:
def transform[A, B](fs: List[A => B]): A => List[B] = x =>
fs.foldRight[List[B]](Nil) {
(f, acc) => f(x) :: acc
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,这适用于任何函数容器,包括函数元组Option[Function1[A, B]],甚至是函数元组TupleN[Option[Function1[A, B]], ...].
编辑:
我刚刚意识到(至少对于List的特殊情况)map函数是有效的:
def transform[A, B](fs: List[A => B]): A => List[B] = x => fs map (_(x))
Run Code Online (Sandbox Code Playgroud)
这可以推广到具有适当语义的map函数的任何东西.什么是适合的类型?
我正在尝试实现类似下面的内容,其中a和b两者都是类型Option[List[Int]]:
val a = List(1, 2, 3).some
val b = for {
xs <- a
el <- xs
} yield el + 1
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,因为它被翻译成了
val b = a flatMap (xs => xs map (el => el + 1))
Run Code Online (Sandbox Code Playgroud)
而我正在寻找
val b = a map (xs => xs map (el => el + 1))
Run Code Online (Sandbox Code Playgroud)
为了理解这一点,我必须将它们嵌套:
val b = for {
xs <- a
} yield for {
el <- xs
} yield el + 1 …Run Code Online (Sandbox Code Playgroud)