teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

697閲覧

kotlinについて勉強しているが読めないコードがあるので助けてほしい

universegift77

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2022/02/04 09:41

編集2022/02/04 09:52

0

0

kotlin

1val func: (Double) -> Double = { x -> x.pow(2.0) }

このコードはFunction typeについて解説するためのサンプルコードなのですが、何をしているのかさっぱり分かりません
自分で調べたり考えたりして推測したものが以下です。各番号についてどなたか解説してくれないでしょうか
完全に初心者でさっぱり分からない状態です。本当にすみません

1.funcという変数名で関数を変数として宣言している
2.:は、変数名:型 という構文のためにある
3.(Double)は関数の型を明示している。引数の型?引数の型だとしたら複数の引数があるときは(Double,Any)みたいに複数書いてもいいのかな?
4.->がアロー演算子。何をするためかは分からない
5.Doubleがまた出てきたのはなんのため?型はさっき宣言したはず。ここでは直後に=があるので変数名?それとも返り値の型?
6.{}内が関数の処理内容
7.->がアロー演算子。なんのためかは分からない

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

kotlin

1val func: (Double) -> Double = { x -> x.pow(2.0) }
  • val func ... funcという変数を定義する
  • : (Double) -> Double ... funcの型定義。(Double) Double型の引数とひとつとり、-> Double Double型を返す関数
  • = ... その定義は、
  • { x -> x.pow(2.0) } ... だぞ

ラムダ式ではなく、関数で定義するとこう。

kotlin

1fun func(x: Double): Double { 2 return x.pow(2.0) 3} 4 または、 5fun func(x: Double): Double = x.pow(2.0) 6 または、 7fun func(x: Double) = x.pow(2.0)

投稿2022/02/04 10:04

編集2022/02/04 10:07
shiketa

総合スコア4133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

universegift77

2022/02/04 10:30

ありがとうございます。 それぞれ、 val 関数名:(引数型) -> 返り値型={処理内容} fun 関数名(引数の変数名:引数型): 返り値型=処理内容 fun 関数名(引数の変数名:引数型): 返り値型{ 処理内容 return 返り値 } ということでしょうか。 分かったと思って本の続きを読んでいたら直後に高階関数のサンプルサンプルコードが出てきて、そこでは関数の型定義が従来の二つ(引数の型定義と返り値の型定義)より多いので困惑してしまいました。。 fun getCurve( surface: (Double, Double) -> Int, x: Double ): (Double) -> Int { return { y -> surface(x, y) } } getCurve()内のsurfaceとxが引数で、ここではsurfaceという関数を引数にとった高階関数が解説されているようです。 :直後の(Double)はこれまでの解釈通りなら返り値の型ということで合っていますでしょうか? すると、その直後に-> Intでなんの型を指定しているのか分からないIntが出てきます。 fun 関数名(引数の変数名:引数の型):(返り値の型)->Int{処理内容} かな?と解釈したのですが、Intは何を意味しているのでしょうか?
ozwk

2022/02/04 12:01

fun 関数名(仮引数名:型)戻り値の型{処理内容}
shiketa

2022/02/04 12:21 編集

> すると、その直後に-> Intでなんの型を指定しているのか分からないIntが出てきます。fun 関数名(引数の変数名:引数の型):(返り値の型)->Int{処理内容}かな?と解釈したのですが、Intは何を意味しているのでしょうか? getCurve()関数の戻り値は、`(Double) -> Int`です。先に書いたのと同じように、「引数にひとつのDouble型を取りInt型を返す関数」。 getCurve()関数は、`(Double, Double) -> Int`関数型のsurfaceと`Double`型のxを引数にとり、`(Double) -> Int`関数型を返す、関数。そう読めばいい。
TakaiY

2022/02/04 13:46

横から失礼します。 surface: (Double, Double) -> Int や (Double) -> Int についてちょっと一言。 kotlinでは、変数の後に: を付けてその変数の「型」を指定することができます。 xは普通の値を持つ変数なので、doubleというわかりやすい型の記述で表わされています。 kotlinなどの関数型の特徴を持つ言語では、関数を値として持つ変数が使えます。surfaceはそれです。 その変数にも「型」が必要ですが、その表し型が、 (<引数の型のリスト>) -> <返り値の型> という書式なのです。 なので、 surface: (Double, Double) -> Int, これは、surface という変数が、「 (Double, Double) -> Int」 という「型」を持っているという意味です。 そしてこれは、surfaceが 「Doubleを2つ引数に取り、Intを返す関数」であるという意味です。 あとから出てくる 「(Double) -> Int」は getCurve 関数の型です。 なので、これは、「getCurveは Doubleを1つ取り、Intを返す関数」であることを示しています。
universegift77

2022/02/04 14:03

>getCurve()関数は、`(Double, Double) -> Int`関数型のsurfaceと`Double`型のxを引数にとり、`(Double) -> Int`関数型を返す、関数 なるほど!そんなことも出来るんですね!めちゃくちゃスッキリしました。ありがとうございます
universegift77

2022/02/04 14:35

TakaiYさん 関数型は「(<引数の型のリスト>) -> <返り値の型>」という形式で書くということですね そして、(Double) -> IntがgetCurve関数の型になっているということで、一つのDouble型を引数として一つのInt型を返す関数ということでしょうか では、getCurve関数とsurface,xとの関係はどうなっているのでしょうか?
universegift77

2022/02/04 14:35

shiketaさんはgetCurve関数について「surface,xを引数にとり、"(Double)->Int"という関数型を返す」と言っていて TakaiYさんはgetCurve関数について「一つのDoubleを引数にとり、Intを返す」と言っているので、お二人の意見が異なっているように見えます。 どちらの意見が正しいのでしょうか?(それともお二人とも同じことを言っていて僕が理解できていないだけなのかもしれないのですが、、)
shiketa

2022/02/05 01:50 編集

* 「... getCurve 関数の型です」 by TakaiYさん * 「getCurve()関数の戻り値は...」 by shiketa 関数の型、つまり、関数の戻り値と捉えて、 * 「一つのDoubleを引数にとり、Intを返す」 by TakaiYさん == 「"(Double)->Int"」 by shiketa
universegift77

2022/02/05 10:38

お手数をおかけして本当に申し訳ないです。お返事本当にありがとうございます お二人とも同じこと(getCurve()自体は”(Double)->Int”関数型であり、一つのDoubleを引数にとって一つのIntを返す関数である)を言っているということは理解できました ただ、TakaiYさんにも聞いたのですが、getCurve関数とsurface,xとの関係がやはり分かりません。ここの関係はどうなっているのでしょうか shiketaさんの 「getCurve()関数は、`(Double, Double) -> Int`関数型のsurfaceと`Double`型のxを引数にとり、`(Double) -> Int`関数型を返す、関数。そう読めばいい。」 という部分と 「引数にひとつのDouble型を取りInt型を返す関数」 という部分は矛盾しないのでしょうか?
shiketa

2022/02/05 11:31

> getCurve関数とsurface,xとの関係がやはり分かりません。ここの関係はどうなっているのでしょうか 関係ですか...。 `fun getCurve(surface: (Double, Double) -> Int, x: Double): (Double) -> Int { return { y -> surface(x, y) } }` getCurve関数の定義はこうなのだから、surface と x がどこで使われているか、それ読めば、関係はわかるのではないでしょうか。 実際に呼んでみればいい。 ``` $ kotlinc >>> fun getCurve(surface: (Double, Double) -> Int, x: Double): (Double) -> Int { return { y -> surface(x, y) } } >>> val res = getCurve({ a, b -> (a + b).toInt() }, 3.0) >>> res(4.0) kotlin.Int = 7 >>> val res2 = getCurve({a, b -> Math.pow(a, b).toInt()}, 3.0) >>> res2(4.0) kotlin.Int = 81 ```
universegift77

2022/02/05 21:42

ありがとうございます 関数なのにクラスのインスタンス化みたいに一度res1,res2という変数を作ってから使うことがあるんですね。これまで触ってきた言語ではあまりそういう書き方をしたことがなかったので新鮮です 実際に使っているところを見て初めてイメージがつかめました。ありがとうございます! getCurve({a,b->Math.pow(a,b).toInt()},3.0)(4.0) と書いても動きました。関数に()が二つつくような書き方をするコードなんてあるんですね いろいろなことを教えてくださりありがとうございます!!
guest

0

私も kotlin はイマイチなのですが、

  1. val func
  2. :
  3. (Double) -> Double
  4. =
  5. { x -> x.pow(2.0) }

の 5 つに分けて考えるのは如何でしょうか。

  1. は変数(名前)の宣言
  2. はセパレータな感じ
  3. は Double を引数とし、 Double を返すという関数型
  4. はこの変数への代入な感じ
  5. がその実体(x が仮引数で x.pow(2.0) が返される.)

"->" はそれだけで何かでは無く「"左のが入力(引数)で右のが出力(返値)なモノ"を表すためのモノ」といった感じかと。

投稿2022/02/04 10:06

編集2022/02/04 10:15
jimbe

総合スコア13350

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問