我學習Scala,並具有以下玩具代碼:如何在Scala中構建泛型方法?
object M {
def isSorted[X](xs: Array[X], compare: (X, X) => Boolean): Boolean =
xs.dropRight(1).zip(xs.drop(1)).forall(Function.tupled(compare))
def curry[A,B,C](f: (A, B) => C) : A => (B => C) =
(a) => (b) => f(a, b)
}
我的目標是把它想:
M.curry(M.isSorted)(Array(1,2,3))((a, b) => a < b)
但我收到的錯誤:
scala> M.curry(M.isSorted)(Array(1,2,3))
<console>:8: error: type mismatch;
found : Int(1)
required: Nothing
M.curry(M.isSorted)(Array(1,2,3))
讓我們備份並觀察咖喱功能的類型:
scala> M.curry(M.isSorted)
res2: Array[Nothing] => (((Nothing, Nothing) => Boolean) => Boolean) = <function1>
這並不好。它想要一個Array[Nothing]
,但不能有Nothing
的實例。
我明白在某些時候我需要引入一個約束,以便編譯器可以證明表達式a < b
是允許的;也就是說,a
和b
是Ordered。但我不知道我會把約束放在哪裏。 curry
是完全通用的;約束不屬於那裏。 isSorted
對compare
的實施一無所知,所以它也不屬於那裏。
最近我已經得到了有它的工作是與def isSorted[X >: Any]
scala> M.curry(M.isSorted)(Array(1,2,3))((a, b) => a < b)
<console>:8: error: value < is not a member of Any
M.curry(M.isSorted)(Array(1,2,3))((a, b) => a < b)
^
scala> M.curry(M.isSorted)(Array(1,2,3))((a: Int, b: Int) => a < b)
<console>:8: error: type mismatch;
found : (Int, Int) => Boolean
required: (Any, Any) => Boolean
M.curry(M.isSorted)(Array(1,2,3))((a: Int, b: Int) => a < b)
^
我怎樣才能得到這個工作?
只需添加到其他的答案,如果你需要傳遞一個函數*左右,並保持通用的,而你把它傳遞*,你必須使用像[不成形聚(HTTP一招://計算器的.com /問題/ 28206295 /理解-單態 - 例如 - 的-不成形)。 – lmm 2015-02-08 08:33:07
@Pater Winton是的,像「無形」這樣的東西在某些情況下可以使生活更簡單......但現在關注於理解Scala和函數式編程本身。現在不要考慮流浪到無形土地。 – 2015-02-08 10:27:17