小编Ben*_*hom的帖子

(case)类构造函数的上下文中的隐式转换

我想让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)

scala implicit implicit-conversion

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

为什么我的Rust程序比同等的Java程序慢?

我正在使用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)

performance file-io rust

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

将M [A => B]变换为A => M [B]

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函数的任何东西.什么是适合的类型?

functional-programming scala scalaz

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

避免嵌套以便使用monadic操作进行理解

我正在尝试实现类似下面的内容,其中ab两者都是类型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)

functional-programming scala scalaz

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