如何理解scala API的函数签名?

时间:2016-11-17 18:55:43

标签: scala

我有时难以理解如何调用函数。我正在研究清单,并正在编写其方法的示例。

$breakpoints: ( s: (320, 479), sm: (480, 767), m: (768, 1023), l: (1024, 1439), xl: (1440, null)); @function returnThatMap() { @each $name, $values in $breakpoints { @for $i from 1 through length($name) { $min: nth($values, 1); // if the last one @if ($i == length($name)) { @return 'calc($i * 1.2) $min / 16 * 1em' } // if not the last one @else { @return 'calc($i * 1.2) $min / 16 * 1em', } } } } $ms-range : returnThatMap() ; // OUTPUT FORMAT NEEDED below!! (dummy numbers, but correct syntax - ie. number ' ' [number]em,number ' ' [number]em, number ' ' [number]em;) // $ms-range: // 1.2 20em, // 1.333 30em, // 1.618 40em, // 1.8 50em, // 2 60em; 定义如下

andThen

我知道我必须将函数文字传递给def andThen[C](k: (A) ⇒ C): PartialFunction[Int, C] 。所以我创建了以下代码。

andThen

由于列表是Integers,A必须是Int。 C可以是任何函数,取决于函数文字的输出。

以上是有道理的。

后来我尝试了scala> val l = List (1,2,3,4) l: List[Int] = List(1, 2, 3, 4) //x:Int works scala> val listAndThenExample = l.andThen((x:Int) => (x*2)) listAndThenExample: PartialFunction[Int,Int] = <function1> //underscore works scala> val listAndThenExample = l.andThen(_*2) listAndThenExample: PartialFunction[Int,Int] = <function1> 。其签名如下

applyOrElse

从上面,我知道A1可以是Int或它的子类(upperbound),而某些B1将是返回类型(取决于我在默认函数中所做的)。

如果我对A1和B1的理解是正确的,则x将是Int或其子类,默认函数文字应该采用Int(或子类)并返回一些B1。我尝试按如下方式调用该函数,但在使用def applyOrElse[A1 <: Int, B1 >: A](x: A1, default: (A1) ⇒ B1): B1 时它不起作用,但在我使用y:Int时起作用。我不明白为什么。

_:Int

问题 - 为什么x:Int和_:Int都适用于然后而不适用于applyOrElse?

问题 - 什么是'A'以及为什么B1与A有关?

2 个答案:

答案 0 :(得分:1)

根据文档,applyOrElse(x, default)相当于

if (pf isDefinedAt x) pf(x) else default(x)

在这种情况下,您的部分函数是一个列表,即从索引(0到3)到值(1,2,3,4)的函数。所以当你这样做时

l.applyOrElse(y,(x:Int)=>println("Wrong arg "+x))

你说&#34;如果有意义,请致电l(y),否则println("Wrong arg"+y)&#34;。编译器合理地回应,&#34;什么是y?&#34;

如果您使用实际值,则按预期工作

l.applyOrElse(3 ,(x:Int)=>println("Wrong arg "+x)) // returns 4
l.applyOrElse(8 ,(x:Int)=>println("Wrong arg "+x)) // prints Wrong arg 8

使用下划线做了完全不同的事情,你得到一个部分应用的函数(这与部分函数完全不同!)

val f = l.applyOrElse(_:Int, (x:Int)=>println("Wrong arg "+x))
f(8) // prints Wrong arg 8

答案 1 :(得分:0)

你还没有宣布y,所以试图使用它是一个错误。 _:Int有效,因为现在正在创建部分应用的函数。请注意,返回类型不是值,而是函数。这个返回的函数是applyOrElse,第二个参数已经提供(但不是第一个)。

使用andThen示例,_的使用意味着不同的东西,特别是它是函数文字的简写符号。