我有下面的HOF,它以函式為引數
def findFirst[A](ss:Array[A], p:A=>Boolean):Int ={
@tailrec
def loop(n:Int):Int ={
if(p(ss(n))) n
else if (n 1>=ss.length) -1
else loop(n 1)
}
loop(0)
}
我可以使用以下引數呼叫上述函式,但我想知道是否有更好的方法來實作 p?
println(findFirst(Array(6, 1,2,3,4,5,6) ,(a:Int)=> a.equals(6)))
uj5u.com熱心網友回復:
因此,僅關于“實作的更好方法p”,并假設您在 Scala 2 中編碼(基于編碼風格),我建議您這樣做:
def findFirst[A](ss: Array[A])(p: A => Boolean): Int = ...
// And then when calling the function:
findFirst(Array(1, 2, 3, 4, 5, 6))(_ == 6)
那是因為在 Scala 2 中,型別推斷是從最左邊的括號中完成的,因此A推斷是Int從第一個引數集推斷出來的,并且您可以p以非常簡潔的方式傳遞函式。而且當你可以使用柯里化函式時它更有意義,不是嗎?您在第一個引數集中傳遞陣列,在第二個引數集中傳遞函式,就像“在陣列中找到第一個滿足 p 謂詞的元素”
uj5u.com熱心網友回復:
這個怎么樣?
def findFirstIndex[A](ss: Array[A])(p: A => Boolean): Int = {
@tailrec
def loop(indexedArray: List[(A, Int)]): Int = indexedArray match {
case Nil => -1
case (a, n) :: xs if p(a) => n
case _ :: xs => loop(xs)
}
loop(ss.toList.zipWithIndex)
}
我將陣列轉換為串列到方法中,以便有機會使用 cons 運算子執行一些結構匹配::。這是函式式語言中用于避免集合索引地獄和所有“off by 1”總線的常用技術。
讓我說回傳 -1 是個壞主意;我會改用選項。
def findFirstIndexSafe[A](ss: Array[A])(p: A => Boolean): Option[Int] = {
@tailrec
def loop(indexedArray: List[(A, Int)]): Option[Int] = indexedArray match {
case Nil => None
case (a, n) :: xs if p(a) => Some(n)
case _ :: xs => loop(xs)
}
loop(ss.toList.zipWithIndex)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/498439.html
上一篇:在Scala中將JSON轉換為Seq<String>
下一篇:Spark/Scala-在執行withColumn操作時加入結果集給出型別不匹配錯誤;發現:org.apache.spark.sql.Columnrequired:Boolean
