2017-06-28 8 views
0

私は次のようにADTのすべてのメンバーのために使用することができる(猫0.9から)Showのインスタンスを定義しようとしています:特定の型のすべてのサブクラスで使用できる、どのようにしてスカラーの型クラスのインスタンスを定義できますか?

import $ivy.`org.typelevel::cats:0.9.0`, cats.Show 

sealed abstract class Colour(val name: String) 

implicit val ColourShow = new Show[Colour] { 
    def show(c: Colour) = c.name 
} 

object Colour { 
    object Red extends Colour("Red") 
    object Blue extends Colour("Blue") 
} 

import Show._ 

println(Colour.Red.show) 

該当するインスタンスはしかし、Redのために見つけることができません。

Compiling /Users/Rich/Projects/worksheets/fp-patterns/Colours.sc 
/Users/Rich/Projects/worksheets/fp-patterns/Colours.sc:16: value show is not a member of object ammonite.$file.Colours.Colour.Red 
val res_5 = println(Colour.Red.show) 
          ^
Compilation Failed 

このようにタイプメスを使用することはできますか?私は、Colorの各コンクリートのインスタンスごとに個別のインスタンスを定義する必要がないようにしようとしています。

+0

てみ '(Colour.Red:カラー) – OlivierBlanvillain

+0

この.show'はまだ/'コンパイル/Users/Rich/Projects/worksheets/fp-patterns/Colours.sc を与えます$ file.Colours.Colour val res_5 = println((Colour.Red:Color).show) ユーザ/リッチ/​​プロジェクト/ワークシート/ fp-patterns/Colours.sc:16:value showはアンモナイトのメンバーではありません。^ コンパイルに失敗しました ' –

+1

'import cats.implicits._' – OlivierBlanvillain

答えて

1

あなたはここで起こっていることを間違っていると思います。あなたが定義した暗黙的なものは実際にインスタンスに対して機能します。

例えば、

ColourShow.show(Colour.Red) 

引数なしで、色のインスタンス上でshow()を呼び出すことができるようにしたい場合は、引数を取らないメソッドのショーを持っている特性の定義を提供する必要があります、そしてColorからその特性への暗黙的な変換。

1

さらに人々が指摘しているものを、あなたはimport cats.implicits._

での作業の例を参照してくださいインポートする必要がありますへ:またColourためShowインスタンスを作成するために短いバージョンを使用することができますhttps://scastie.scala-lang.org/d1egoaz/LVaJEccDSeas9VmzHqf1ug/1

implicit val colourShow: Show[Colour] = Show.show[Colour](_.name) 
+0

' show'の独自のインスタンスを定義していない場合、 'cats.implicits._'のインポートが必要なのは間違いありませんか? –

+1

わかりません:/猫のジッタチャンネルで質問したいかもしれません。https://gitter.im/typelevel/cats –

関連する問題