

kotlinのコマンドラインインタプリタ(kotlinc-jvm 1.1.2-2)上で、まず関数`id`を定義し、

[code]

    >>> fun id(x: Int) = x
    
[/code]

次に関数`applyTo10`を定義しようとしたところエラーが出ました。

[code]

    >>> fun applyTo10(f: (Int) -> Int = ::id) = f(10)
    error: left-hand side of a callable reference with a receiver parameter cannot be empty. Please specify the type of the receiver before '::' explicitly
    fun applyTo10(f: (Int) -> Int = ::id) = f(10)
    
[/code]

エラーメッセージに従えばレシーバの型を指定してやれば良さそうですが、この場合のレシーバの型が何なのか分かりません。

ところで関数参照の代わりにラムダ式を与える場合はエラーになりません。

[code]

    >>> fun applyTo10(f: (Int) -> Int = { it }) = f(10)
    >>> applyTo10()
    10
    
[/code]

デフォルト引数の関数を名前(この場合は`id`)で指定するにはどうすればよいでしょうか？

**追記**  
妥協案としてはラムダ式の中で名前を使って

[code]

    fun applyTo10(f: (Int) -> Int = { id(it) }) = f(10)
    
[/code]

とする等。


CC BY-SA 3.0
2017-06-10T08:04:18.837
35458
2017-09-01T14:12:02.683
2017-06-11T12:37:09.837
13199
13199
question
kotlin
インタプリタ上で関数をデフォルト引数として与えるには？


KotlinのREPLで順番に定義を書いていった場合、kotlincでコンパイルするプログラムと（おそらく）違う処理がされるので、そのせいだと思います。回答にある、`Line1`とかはおそらく、一行目に定義した`id`に関する何かを持っているクラスあるいはオブジェクトだと思うのですが、それを参照することは通常想定されていないと思うので、仕方ない気がします。

以下のように `object` にラップしてみるのはどうでしょうか。

[code]

    Welcome to Kotlin version 1.1.0 (JRE 1.8.0_111-b14)
    Type :help for help, :quit for quit
    >>> object W {
    ...   fun id(x: Int) = x
    ... }
    >>> fun applyTo1o(f: (Int) -> Int = W::id) = f(10)
    
[/code]

あと、`Line1` とか `Line2` の正体を知るために実験してみました。

[code]

    Welcome to Kotlin version 1.1.0 (JRE 1.8.0_111-b14)
    Type :help for help, :quit for quit
    >>> fun add(x: Int, y: Int) = x + y
    >>> fun sub(x: Int, y: Int) = x - y
    >>> val a = Line1::add
    >>> val s = Line2::sub
    >>> a(1, 2)
    error: the integer literal does not conform to the expected type Line1
    a(1, 2)
      ^
    error: no value passed for parameter y
    a(1, 2)
          ^
    
    >>> a(Line1(), 1, 2)
    3
    >>> s(Line2(), 1, 2)
    java.lang.NoSuchMethodError: Line2: method <init>()V not found
    
[/code]

この結果を見る限り、REPLの各行で定義した関数などの情報を保持しているクラスが `LineN`  
という形で見えているのだと思います（ `Line2()` が実行時例外で死ぬのがちょっと謎ですが）


CC BY-SA 3.0
2017-06-11T09:48:39.583
35478
2017-06-11T09:59:16.610
2017-06-11T09:59:16.610
23718
23718
35458
answer


thisでは？

[code]

    fun id(x: Int) = x
    fun applyTo10(f: (Int) -> Int = this::id) = f(10)
    applyTo10()
    
[/code]


CC BY-SA 3.0
2017-09-01T14:12:02.683
37666
2017-09-01T14:12:02.683
9463
35458
answer