【问题标题】:Rules and practices for order of parameter sets in Scala functionsScala 函数中参数集顺序的规则和实践
【发布时间】:2017-10-05 00:47:01
【问题描述】:

假设有一个函数 foo 应该通过将一些工作委托给作为参数传递的其他函数来计算输入值 R 的一些返回值 T

例如,可以这样定义它:
def foo(data: List[T], delegate: T => R): List[R]

但是,如果我想通过数据或委托重用我的函数,我不能,所以我可以将它们拆分为单独的参数集,如下所示:
def foo(data: List[T])(delegate: T => R): List[R]

但是,现在出现了一个问题。这是一个“好”的订单,还是应该是
def foo(delegate: T => R)(data: List[T]): List[R]

我想我的问题的概括形式如下:假设我们需要定义一个函数 f,它对数据 x1, x2, ..., xN 进行操作,使用对数据进行操作的委托函数 g1, g2, ..., gM 和函数 @987654330 @ 不对数据进行操作,函数 f 的参数集的首选/正确顺序是什么?为什么?

【问题讨论】:

    标签: scala function methods parameters currying


    【解决方案1】:

    正确的顺序是数据第一,功能第二。

    第一个原因是,如果T 是你的函数的类型参数,你会通过这种方式得到更好的类型推断:

    scala> def foo[T](l: List[T])(f: T => T): Unit = ()
    foo: [T](l: List[T])(f: T => T)Unit
    
    scala> foo(List(1))(x => x + 1)
    
    scala> def foo2[T](f: T => T)(l: List[T]): Unit = ()
    foo2: [T](f: T => T)(l: List[T])Unit
    
    scala> foo2(x => x + 1)(List(1))
    <console>:13: error: missing parameter type
           foo2(x => x + 1)(List(1))
    

    第二个原因是匿名函数看起来更好。比较

    foo2[Int] { x =>
      x + 1
    } (List(1)) // Meh
    

    foo[Int](List(1)) { x =>
      x + 1
    } // Wow
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多