簡體   English   中英

Scala中的部分應用程序不是參照透明的嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM