Scala功能成分

时间:2014-02-25 16:23:07

标签: scala

我正在努力让函数curry正常工作。我所拥有的是以下内容:

    def method(x: ByteArrayInputStream)
              (y: ByteArrayOutputStream)
              (z: GZIPOutputStream)
              (func: (ByteArrayInputStream, GZIPOutputStream) => Unit) = {

    .....
    .....

    }

现在,当我打电话给它时,我称之为:

    method(new ByteArrayInputStream("".getBytes("UTF-8"))) 
          (new ByteArrayOutputStream()) 
          (new GZIPOutputStream(_)) 
          (myFunc(_, _))

我的理解是在第三个参数,即GZIPOutputStream中,当我说_时,它将从第二个参数中选择值。但它抱怨说

Type mismatch, expected: GZIPOutputstream, actual: (OutputStream) => GZIPOutputStream

任何提示?

3 个答案:

答案 0 :(得分:0)

我不确定如何做到这一点......但是这里有一个模仿你正在寻找的解决方案

def add(j: Int)(i: Option[Int] = None): Int = j + i.getOrElse(j)
add(5)()

add(5)()返回10并使用j值

答案 1 :(得分:0)

问题出在

(new GZIPOutputStream(_))

正如您的错误所述,您的方法需要一个GZIPOutputstream,但您正在向其传递一个函数OutputStreamGZIPOutputStream

下划线一开始有点混乱,但这是告诉scala你故意不将参数传递给GZIPOutputStream以便它不会抱怨缺少参数的方法。换句话说,您传递函数本身而不是函数的结果。

如何解决这个问题取决于你实际上要做什么。如果您确实要传递GZIPOutputStream,则需要将_替换为OutputStream

如果您的意图是method创建一个GZIPOutputStream给定一个像您要传递的工厂函数,您需要更改z的声明类型。例如,

(z: (OutputStream) => GZIPOutputStream)

然后在方法正文中,您可以说z(y)之类的内容来获得GZIPOutputStream。 (或者将y替换为其他输出流。)

答案 2 :(得分:0)

我已经设法去了一点,这就是我去过的地方:

val bytePayload = method(new ByteArrayInputStream(s.getBytes("UTF-8")))(new ByteArrayOutputStream())(writeBytes(_,_))

  def method(bin: ByteArrayInputStream)
            (bos: ByteArrayOutputStream)
            (func: (ByteArrayInputStream, GZIPOutputStream) => Unit): Either[String, Array[Byte]] = {
    val gzip = new GZIPOutputStream(bos)

    try {
      func(bin, gzip)
      gzip.finish
    } catch {
      case e: Exception => Left(e.getMessage)
    } finally {
      bin.close()
      bos.close()
      gzip.close()
    }
    Right(bos.toByteArray)
  }

虽然我仍然处理例外,但我在某种程度上确信我不会抛弃它们。