6
A
回答
10
是的,這是可能的。
當你有標記爲implicit
第二令行禁止參數,功能似乎是類型不是
Int => (MyClass => Result) => ResultOfFunction
它是如果咖喱高階函數的參數是一個普通參數;相反,它看起來像這樣:
Int => ResultOfFunction
這裏有一個簡單的例子:
scala> def curriedFn(i : Int)(implicit func : String => Int) : Boolean = (i + func("test!")) % 2 == 0
curriedFn: (i: Int)(implicit func: String => Int)Boolean
scala> implicit val fn : String => Int = s => s.length
fn: String => Int = <function1>
scala> curriedFn _
res4: Int => Boolean = <function1>
正如你所看到的,implicit
參數得到了 '淘汰'。爲什麼和如何?這是一個比我更有知識的人的問題。如果我不得不猜測,我會說編譯器直接用隱式值替換參數,但這很可能是錯誤的。
反正離題不談,這裏是你的情況非常相關的一個例子:
scala> def foo(func : Int => Boolean) = if(func(3)) "True!" else "False!"
foo: (func: Int => Boolean)String
scala> foo(curriedFn)
res2: String = True!
現在,如果第二個函數參數不隱:
scala> def curriedNonImplicit(i : Int)(fn : String => Int) : Boolean = (i + fn("test!")) % 2 == 0
curriedNonImplicit: (i: Int)(fn: String => Int)Boolean
scala> curriedNonImplicit _
res5: Int => ((String => Int) => Boolean) = <function1>
正如你所看到的,類型的功能有點不同。這意味着,該解決方案將有不同太:
scala> def baz(func : Int => (String => Int) => Boolean) = if(func(3)(s => s.length)) "True!" else "False!"
baz: (func: Int => ((String => Int) => Boolean))String
scala> baz(curriedNonImplicit)
res6: String = True!
你必須直接指定函數的方法中,因爲它不是隱含之前提供。
相關問題
- 1. Scala:通過plusMonth/plusYear函數作爲參數
- 2. 在Scala中使用foldLeft對curried函數應用參數列表
- 3. 將列表元素作爲參數傳遞給curried函數
- 4. 通過無效作爲函數參數
- 5. 通過匿名函數作爲參數
- 6. Scala - 函數作爲參數的方法
- 7. curried函數中的默認參數
- 8. Curried函數f#
- 9. Scala的通值的函數作爲參數
- 10. scala命名參數在函數作爲參數?
- 11. scala - 傳遞函數將另一個函數作爲參數
- 12. 如何定義接受curried函數參數的函數?
- 13. 通過函數指針作爲參數的另一個函數的參數
- 14. 通過參數化構造函數作爲方法參考
- 15. 通過named_scope作爲參數
- 16. 通過$(this)作爲參數?
- 17. 通過類作爲參數
- 18. 爲什麼不能使用curried參數的f#函數有可選參數
- 19. 通過函數參數
- 20. Elixir - 通過函數參數
- 21. Scheme,高階函數和curried函數
- 22. 蟒通列表作爲函數參數
- 23. Oracle ROWID作爲函數/過程參數
- 24. Scala:foreach中的curried函數?
- 25. Curried函數被緩存?
- 26. 結合兩個curried函數
- 27. 如何在Scala中添加隱式curried參數?
- 28. 如何通過數組作爲參數
- 29. 通過std :: array作爲參考參數
- 30. Scala中是否有可能使用匿名函數創建部分curried函數
感謝您用完整的例子來解釋這兩種情況(有和沒有隱含的)。 – Prasanna