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

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

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

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Q&A

1回答

490閲覧

条件付きの継承・ミックスイン

mightyMask

総合スコア143

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

0グッド

1クリップ

投稿2020/04/08 08:47

Scala

1trait Show { 2 def show :String 3} 4 5class Pair[A <: Show](val _1 :A, val _2 :A) extends Show { 6 def show :String = { 7 "Pair(" ++ this._1.show ++ ", " ++ this._2.show ++ ")" 8 } 9}

この時、「AShowのインスタンスでないとPair[A]は存在しない」わけですが、「どんなAでも常にPair[A]は存在するがAShowのインスタンスである時のみPair[A]Showのインスタンスである」ってしたいです。
ここでいうインスタンスとは、オブジェクト指向でいうインスタンスの事ではなく、関数型でいうところのインスタンスの事です。

Haskellで言えば、

Haskell

1instance Show a => Show (Pair a)

みたいなことをしたいです。

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

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

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

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

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

guest

回答1

0

Haskellの型クラス機能はScalaではimplicitという機能で実装できます。
具体的には以下のようになります。

scala

1// Show型クラス 2trait Show[T] { 3 def show(value: T): String 4} 5 6case class Pair[A](_1: A, _2: A) 7 8// 型クラスのPair型インスタンス 9// implicitでTのShowインスタンスが存在するときのみPairもShowであることが保証される 10implicit def pairShowable[T](implicit showT: Show[T]) = new Show[Pair[T]] { 11 override def show(value: Pair[T]): String = s"_1: ${showT.show(value._1)}, _2: ${showT.show(value._2)}" 12} 13 14case class CanShow(value: String) 15 16// 型クラスをCanShow型にインスタンス化 17implicit def canShowAble = new Show[CanShow] { 18 override def show(value: CanShow): String = value.value 19} 20 21case class CantShow(value: String) 22 23// Show型クラスのインスタンスのみを扱える関数 24def show[T](value: T)(implicit showable: Show[T]) = println(showable.show(value)) 25 26// Showインスタンスが存在してもしなくてもPairは定義できる 27val showPair = Pair(CanShow("a"), CanShow("b")) 28val ordinalPair = Pair(CantShow("a"), CantShow("b")) 29 30show(showPair) // => _1: a, _2: b 31show(ordinalPair) // CantShowのShowインスタンスが見つからないためコンパイルエラー 32

またこの話題についてはScalaの関数型ライブラリであるCatsの記事が詳しいです。
https://typelevel.org/cats/typeclasses.html

上の記事の日本語訳です
https://qiita.com/KtheS/items/ccd769de7977a61fd1a4

投稿2020/05/03 00:35

kazchimo

総合スコア172

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問