[英]Partial application in Scala not referentially transparent?
給定兩個功能:
def f(a: String, b: Int): Int = a.length + b
val g: Int => String = _.toString
為什么我可以通過中間分配用g
組成部分應用的f
:
val f_ = f(_: String, 42)
f_ andThen g
// String => String = <function1>
但不直接:
f(_: String, 42) andThen g
// error: value andThen is not a member of Int
這是類型推斷的問題還是預期的行為?
這只是一個語法錯誤,如果打開-Xprint:parser
選項,則會看到表達式與正確的表達式之間的區別,即: (f(_: String, 42)) andThen g
。
您的表情:
((x$1: String) => f((x$1: String), 42).andThen(g))
正確的:
((x$1: String) => f((x$1: String), 42)).andThen(g)
您可以看到區別。 由於擴展規則而發生這種情況,scalac首先將語法標准化為點形式,然后對其進行擴展。 相同的規則適用於這種形式的函數應用程序: func(_)
擴展到最里面的花括號,我不記得它在SLS中寫在哪里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.