Scala:函数参数的命名参数

时间:2015-06-24 15:59:40

标签: scala delegates functional-programming

我有一个代表2D ARGB图像的Image特征。 Image有一个map方法,它采用映射函数并使用所述函数转换图像。映射函数有3个参数:X和Y坐标以及该坐标处图像的颜色。颜色表示为打包到Int的32位ARGB值。

trait Image {
    def map(f: (Int, Int, Int) => Int)
}

但是,如果没有评论,就无法确定f的哪个参数是哪个。

在C#中,我会为此创建一个委托,它允许我命名映射函数的参数:

delegate int MapImage(int x, int y, int color);

Scala中有这种类似的东西吗?是否考虑添加语言?没有它,我就无法编写一个没有明确文档的可读性接口。

(注意:我知道我应该将Int包装在案例类中以表示颜色,但这只是一个说明性的例子。)

2 个答案:

答案 0 :(得分:1)

您可以声明f实施的特征。使用SAM支持(如果使用-Xexperimental进行编译,则启用,并且将在下一版本中使用),这应该同样易于使用。

trait ImageMapper {
  def mapImage(x: Int, y: Int, color: Int): Int
}

trait Image {
  def map(f: ImageMapper) = ...
}

myImage.map{ (x, y, color) => ... } //the anonymous function
// is automatically "lifted" to be an implementation of the trait.

答案 1 :(得分:0)

也许通过使用类型:

trait Image {
  type x = Int
  type y = Int
  type color = Int

  def map(f: (x, y, color) => Int)
}

我更喜欢像这样使用案例类:

case class MapImage(x: Int, y: Int, color: Int)
trait Image {
  def map(f: MapImage => Int)
}