ãªããåã¯ã©ã¹ã¨ãè¨ãã¨åã®æãã²ã¨ãã¡ãæã話ãã¯ã¤ã¯ã¤ãã¦ãã¤ã¡ã¼ã¸ãããã¾ãããããããã¯ããã¾ãããã§ãããã£ã¦ä½ãããããã®ããã¨ãããããã話ã¯ãã¾ãããã¦ããªããããªå°è±¡ãããã¾ããï¼ããã¾ã§å°è±¡ã§ãï¼ããã®ä¸ "Scala ã® implicit parameter ã¯åã¯ã©ã¹ã®ä¸ç¨®" ã¨ãè¨ãããã¨ãæé»çãªå¼æ°ããªãã§åã¯ã©ã¹ã®ä¸ç¨®ãªããï¼ï¼ï¼æå³ãããããï¼ï¼ï¼ï¼ãã¨ãªãã¾ãããããã¯ãªãã¾ããã
ã¨ããããã§ãã®ã¸ãã«ã¤ãã¦åå¼·ããã®ã§æ¸ãã¾ãã
ããããåã¯ã©ã¹ã£ã¦ãªãã
Haskellã¨ãã«ãããã¤ã§ãããã¢ãããã¯å¤ç¸ãå®ç¾ãããã®ããããã§ãããããããããªãæå³ãããããªãã
ã¨ããããã§ãã¾ãã¯ãã¢ãããã¯å¤ç¸ã£ã¦ãªããªã®ãã¨ãã話ãããã¦è¡ãã¾ãã
ãã¦ãã¾ãã¯ãå¤ç¸ãããè¡ãã¾ãããããã®æèã§è¨ãå¤ç¸ã¨ã¯ãç°¡åã«è¨ãã°ãå¼æ°ã«ããããªåãåãããã¨ãããã¨ã§ãã
ããä¾ã«åºããã id é¢æ°ãè¦ã¦ã¿ã¾ãããã
def id[T](x: T) = x
å¼æ°ããã®ã¾ã¾è¿ãã ãã®é¢æ°ã§ãããã®é¢æ°ã¯ãã©ããªåã®å¼æ°ã§ãåãåããã¨ãã§ãã¾ããããããªãµãã«ããããããªåãå¼æ°ã«åãããã£ã¦ã®ããã®æèã§è¨ãã¨ããã®ãå¤ç¸ãã ã¨æã£ã¦ãã ããã
ã¡ãªã¿ã«ãå¼æ°ã«åãã©ã¡ã¼ã¿ãæå®ãããã¨ã§ãã©ããªåã§ãåãå ¥ãããããå®ç¾ãããããªã®ãããã©ã¡ã¼ã¿å¤ç¸ãã¨å¼ã¶ããã§ãã
ã§ã¯ãã¢ãããã¯å¤ç¸ã¨ããã®ã¯ï¼ã¢ãããã¯ã£ã¦ãããã®å ´ã§ãã¨ããå ´å½ããçã«ãã¨ããããªãã¥ã¢ã³ã¹ã®è¨èã§ããããã§ããã®æèã§ã¢ãããã¯å¤ç¸é¢æ°ã£ã¦ã®ã¯ã©ãããæå³ãã£ã¦ããã¨ãããã®åã®ã°ããã¯ããããè¨ç®ãããããã£ã¦ã®ãå®ç¾©ããã¨ããã®åãå¼æ°ã«ã¨ããã¨ãã§ããããã«ãªãé¢æ°ãããã®æå³ã ã¨æã£ã¦ãã ããããªã®ã§ãã¢ãããã¯å¤ç¸ã®å ´åããããã¨ããããåã«å¯¾å¿ãã§ã¯ãªãã¦ããæ¯ãèããå®ç¾©ããã¦ããåã«ã®ã¿å¯¾å¿ããããã¨ã«ãªãã¾ããä¾ãã° Int 㨠String ã«å¯¾ããæ¯ãèãã¯å®ç¾©ããã¦ããã© Boolean ã«å¯¾ããæ¯ãèãã¯å®ç¾©ããã¦ãªãã®ã§ Boolean ã¯åãåããªããã¿ãããªå¤ç¸é¢æ°ãããããããã§ãã
å ·ä½çãªä¾ã¨ãã¦ããã¨ãã°ããå¼æ°ãã²ã£ããè¿ããã¨ããæ¯ãèãããããIntã¨Stringã«å¯¾å¿ããã¢ãããã¯å¤ç¸é¢æ°ãèãã¾ãããã
flipFlap(1) // => -1 flipFlap("string") // => gnirts flipFlap(true) // => ã³ã³ãã¤ã«ã¨ã©ã¼
ãããªæãã§ããããããåããããé¢æ°ããã¢ãããã¯å¤ç¸é¢æ°ãã¨è¨ãã¿ããã§ããã
ãã¦ãã§ã¯åã¯ã©ã¹ã¨ããã®ã¯ãªããªã®ã§ãããï¼ããã¯ããã¢ãããã¯å¤ç¸ãªé¢æ°ãã©ããªåã«å¯¾å¿ãã¦ããããå¶éããããã®ãã¤ã³ã¿ã¼ãã§ã¤ã¹ãã®ãããªãã®ã®ããã§ãããããã¯ããã¢ãããã¯å¤ç¸é¢æ°ãåãåããåã®éåãã¿ãããªãã®ã§ããã¡ãã£ã¨å ·ä½çã«è¦ã¦ã¿ã¾ããããä»ãflipFlap 㯠Int 㨠String ã«å¯¾å¿ãã¦ãã¾ããããã®ã¨ãã便å®çã«flipFlapé¢æ°ã®å¼æ°ã®åã¯ã©ã¹ããflipFlapåã¯ã©ã¹ãã¨å¼ã¶ã¨ãInt 㨠String ã¯ãflipFlapåã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã§ãããã¨è¨ãã¾ããflipFlapãåãåããåã®éåããflipFlapåã¯ã©ã¹ãã¨å¼ã¶ã¨ãããã®è¦ç´ ã²ã¨ã¤ã²ã¨ã¤ããflipFlapåã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãã¨å¼ã¶è¨³ã§ãã
éã®è¨ãæ¹ãããã¨ããflipFlapåã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãã§ããåã§ããããããã°ãflipFlapé¢æ°ã®å¼æ°ã¨ãã¦æ¸¡ãã¦ä¸ãããã¨ãã§ãããã£ã¦ãã¨ã§ãããã¾ããã
ã¤ã³ã¹ã¿ã³ã¹ã¨ãã¯ã©ã¹ã¨ãè¨ã£ã¦ããã©ããªãã¸ã§ã¯ãæåã®ãããããã¯ã©ã¹ãã¨ããã¤ã³ã¹ã¿ã³ã¹ãã¨ã¯é¢ä¿ããªããã¨ã«æ³¨æãã¦ãã ãããåã¯ã©ã¹ã¨åã¤ã³ã¹ã¿ã³ã¹ã®é¢ä¿ã¯ããããåãã§ãããã¨ãå®ç¾©ããæ½è±¡çãªãã®ã§ããã¤ã³ã¿ã¼ãã§ã¤ã¹ã¨ããã®å ·ä½çãªåã§ããã¯ã©ã¹ãã¨ããé¢ä¿ã«è¿ãããããã¾ãããã
ãã¦ã話ã¯å¤ãã£ã¦ããã¨ãã°ãããã«ãã¨ããflipFlap é¢æ°ã« Boolean ã«å¯¾ããæ¯ãèããå®ç¾©ãã¦ãããã¨ãã¾ããããã¨ã
flipFlap(1) // => -1 flipFlap("string") // => gnirts flipFlap(true) // => false
ã¨ãªãã¾ãããããã¯è¨ã£ã¦è¦ãã°ããã¨ãã Boolean ããflipFlapåã¯ã©ã¹ãã«å±ããã¤ã³ã¹ã¿ã³ã¹ã«ãã¦ããããã¨ã«ãªãããã§ãã
å®éã«ãã£ã¦ã¿ã
ã§ã¯å®éã« Scala ã§ã¢ãããã¯å¤ç¸ãå®ç¾ãã¦ã¿ã¾ããããåãã©ã¡ã¼ã¿ä½¿ã£ãããã¾ãå®ç¾ã§ããªãããªããã¨ããçºæ³ãã¾ãåºã¦ãããã§ãã
def flipFlap[T](x: T) = ...
ã§ããã¿ã¼ã³ããã㧠x ã®åã«å¿ããå¦çãæ¸ãâ¦ï¼ã§ãããããã¨ã対å¿ãã¦ãªãåã®å ´åã¯ã³ã³ãã¤ã«ã¨ã©ã¼ãã«ã§ããªãã§ããããè©°ã¾ã£ã¦ãã¾ã£ãâ¦â¦ããããããªãã®ã§ãããã§ããããªãæçµå½¢ããããã®ã§ã¯ãªãã¦ãããã¤ã段éãè¸ãã§ãã£ã¦ããã¾ããããã¾ãã¯ããåã«ãã£ã¦æ¯ãèããç°ãªããªãã"ã²ã£ããè¿ã"ã¨ããæä½ã®å®è£ ã flipFlap ã®å¤ã«åºãã¡ããã°ããããããªãã®ï¼ãã¨ããçºæ³ã§ããããã®ã¯ã©ãã§ãããã
trait FlipFlapper[T] { def doFlipFlap(x:T):T } object IntFlipFlapper extends FlipFlapper[Int] { def doFlipFlap(x:Int) = - x } object StringFlipFlapper extends FlipFlapper[String] { def doFlipFlap(x:String) = x.reverse } def flipFlap[T](x:T, flipFlapper: FlipFlapper[T]) = flipFlapper.doFlipFlap(x) // ...(1) flipFlap(1, IntFlipFlapper) // => -1 flipFlap("string", StringFlipFlapper) // => "gnirts"
(1)ã®è¡ã«æ³¨ç®ãã¦ãã ãããflipFlap é¢æ°ã«ã FlipFlapper åã®å¼æ°ã追å ãã¦ã¿ã¾ãããããã¦ããã®ä¸ããããflipFlapper ã® doFlipFlap ã«ãå®éã«å¤ãã²ã£ããè¿ãå¦çãå§è²ãã¦ãã¾ããä¼çµ±çãªãªãã¸ã§ã¯ãæåã®ããªã¢ã¼ãã£ãºã ãæ´»ç¨ããæãã§ãããã¡ãã£ã¨å¼æ°ãå¢ãã¡ãã£ããã©ãTãå¤ããã°æ¯ãèããå¤ãããã¨ãããã¨ã¯å®ç¾ã§ãã¦ãã¾ããããã«ãããã§ä¾ãã°flipFlap(true, StringFlipFlapper)
ã¿ãããªãã¨ããã¦ããStringFlipFlapper 㯠FlipFlapper[Boolean] ã§ã¯ãªãã®ã§ã³ã³ãã¤ã«ã¨ã©ã¼ã¨ãªãã¾ãã
ãã¦ãããã§ã¯ãflipFlap ã Boolean ã«å¯¾å¿ããã¦ã¿ã¾ãããã
object BooleanFlipFlapper extends FlipFlapper[Boolean] { def doFlipFlap(x:Boolean) = ! x } flipFlap(true, BooleanFlipFlapper)
ã¾ããä¸å¿ããã§ãåãã£ã¡ãåãããå®å ¨ã£ã¡ãå®å ¨ã§ããããã¼ããã§ãããããã£ã±ã第äºå¼æ°ãéªéã§ããã第ä¸å¼æ°ã®å¤ã®åã¯ããã£ã¦ããã ãåæ¨è«ã ã£ã¦ãããã ããããªãã¨ããã®ç¬¬äºå¼æ°ã¯æé»çã«ãããã¾ã解éãã¦ãã£ã¦ãããªãããªãâ¦â¦ãã¨ãªãã¾ããä»ãæé»çã«ãã¨ããè¨èãåºã¦ãã¾ããããimplicit parameter ã使ãã°ããããã§ãã
trait FlipFlapper[T] { def doFlipFlap(x:T):T } implicit object IntFlipFlapper extends FlipFlapper[Int] { // ...(1) def doFlipFlap(x:Int) = - x } implicit object StringFlipFlapper extends FlipFlapper[String] { // ...(2) def doFlipFlap(x:String) = x.reverse } def flipFlap[T](x:T)(implicit flipFlapper: FlipFlapper[T]) = flipFlapper.doFlipFlap(x) // ...(3) flipFlap(1) // => -1 flipFlap("string") // => "gnirts"
ãã¦ãã¾ãã¯(3)ããè¦ã¦è¡ãã¾ãããã
第äºå¼æ°ã¯ implicit parameter ã¨ãã¦æé»ã«åãããã«å¤æ´ãã¾ããããã®ç¶æ
ã§ä¾ãã° flipFlap(1)
ã¨æ¸¡ãããã©ããªãã§ããããï¼
ã¾ããT ã åæ¨è«ã«ãã£ã¦ Int ã«ç¢ºå®ãã¾ãããã¨ãªãã¨ãèªåçã« flipFlapper ã®åã FlipFlapper[Int]ã«ç¢ºå®ãã¾ãã
ãã¦ããã®ã¹ã³ã¼ãã«ãã㦠implicit ã§å®ç¾©ããã¦ãã FlipFlapper[Int] åã®å¤ã¯ã(1)ã§å®ç¾©ããã¦ãã IntFlipFlapper ã ãã§ãã®ã§ãããã§ç¡äº flipFlapper ã«ã¯ IntFlipFlapper ãæé»ã«æç¸ããã¾ãã
ãã flipFlap("string")
ã¨ããå ´åã¯ã©ããªãã§ããããåãçå±ã§ãT ã String ã«ç¢ºå®ãã(2)ã§å®ç¾©ããã¦ãã FlipFlapper[String] åã® implicit ãªå¤ã§ããStringFlipFlapper ã flipFlapper ã«æç¸ããã¾ãã
ã§ã¯ãã®flipFlap é¢æ°ã« Boolean ã追å ãããå ´åã¯ã©ãããã°è¯ãã§ãããï¼
implicit object BooleanFlipFlapper extends FlipFlapper[Boolean] { def doFlipFlap(x: Boolena) = ! x }
ã追å ããã ãã§ããã§ãããåãçå±ã§ãããããå®ç¾©ãã¦ããã° flipFlap(true)
ã¨æ¸¡ã㨠T ã Boolean ã«ç¢ºå®ãã¦ãflipFlapper ã«ã¯ BooleanFlipFlapper ãæé»çã«æç¸ããã¾ãã
ããããflipFlap('c')
ã¨ãããï¼å¯¾å¿ãã FlipFlapper[Char] ã implicit ã«å®ç¾©ããã¦ããªãã®ã§ãã³ã³ãã¤ã«ã¨ã©ã¼ã«ãªãã¾ããï¼ãã£ãï¼
ãã¦ããã®ã¨ããåã¯ã©ã¹ã¨ã®å¯¾å¿ã¯ã©ããªã£ã¦ããã§ãããããFlipFlapper[T] ãåã¯ã©ã¹ãFlipFlapper[Int] ã FlipFlapper[String] ãåã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã®å½¹å²ãæããã¦ãã¾ãããããä¸å¯§ã«èª¬æãã¾ããããdef flipFlap[T](x:T)
ãªããTã«ã¯ã©ããªåãå
¥ã£ã¦æ¥ãã¦ãã¾ãã¾ãããããã(implicit FlipFlapper[T])
ãããã¨ãFlipFlapper[å
·ä½çãªå] ãå®ç¾©ããã¦ããå以å¤ãå¼æ°ã«æ¸¡ãããã³ã³ãã¤ã«ã¨ã©ã¼ã«ãªãã¾ãããããã¦ãä¾ãã° FlipFlapper[Int] ãå®ç¾©ãã¦ããã°ãflipFlap 㯠Int ãåãåããã¨ãã§ãã¾ããã¤ã¾ãã ãFlipFlapper[å
·ä½çãªå]ããç¶æ¿ãããªãã¸ã§ã¯ããããå ´åããã®å
·ä½çãªåããflipFlapãè¨ç®å¯è½ãªåãã«ãªãããã§ããã
ãããªæãã§ãFlipFlapper[T] ãåã¯ã©ã¹ãFlipFlapper[Int] ã FlipFlapper[String] ãåã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã®å½¹å²ãæããã¦ãããã¨è¨ããããã§ãã
ããã§ã implicit parameter ãåã¯ã©ã¹ã®ä¸ç¨®ã§ãããã¨ãããã¨ã確èªã§ãã¾ããã
ã¾ã¨ã
- ã¢ãããã¯å¤ç¸ãªé¢æ°ã£ã¦ã®ã¯ãããã®åã«å¯¾ãã¦ã¯ããããæ¯ãèããããããã¨å®ç¾©ãã¦ãããã¨ã§ããããªåãåãåããã¨ãã§ããããã«ãªãé¢æ°ã
- ã¢ãããã¯å¤ç¸ãå®ç¾ããã¦ãã¨ãåã«ãã£ã¦æè»ãªæ¯ãèããã§ãã¦ããããããã³ã³ãã¤ã«æã«åãã§ãã¯ã§å®ããã¦ããããã
- ãã¢ãããã¯å¤ç¸é¢æ°ãåãå ¥ãããã¨ãå¯è½ãªå ·ä½çãªåï¼Intã¨ãStringã¨ãï¼ãã®ãã¨ããåã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãã¨å¼ã³ããã®éåããåã¯ã©ã¹ãã¨å¼ã¶ã
- è¨ãæããã°ãåã¯ã©ã¹ã¯ããã®ã¢ãããã¯å¤ç¸é¢æ°ãã©ããªå
·ä½çãªåãåãå
¥ãããã¨ãã§ããã®ãããç¸ãå½¹å²ããããã®ã§ãããã
- ããã¢ãããã¯å¤ç¸é¢æ°ã¯ãã®åã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã§ããåããåãå ¥ããªãã
- éã«è¨ãã°ãããåã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã§ãããªãã°ããã®åã¯ã©ã¹ãæä¾ããã¢ãããã¯å¤ç¸é¢æ°ã®å¼æ°ã«æ¸¡ããã¨ãã§ããã
- Scalaã«ããã¦ã¯ implicit parameter ã§æ¸¡ããå¤ãå¤æ ããããã¨ã§ã¢ãããã¯å¤ç¸ãå®ç¾ã§ããã
- å¤æ ãããããã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ããã¨ããã® trait ãåã¯ã©ã¹ã«ããã®å®è£ ã§ããã¨ããã® implicit 㪠object ãåã¤ã³ã¹ã¿ã³ã¹ã«å¯¾å¿ããã
- ããªãã¡ãimplicit parameter ã¯åã¯ã©ã¹ã®ä¸ç¨®ã§ããã
ãã®ä»
åç´ã«ãå¼æ°ã®åã«ãã£ã¦æ¯ãèããå¤ãããã¨ããæå³ã§ã¯ã¡ã½ããã®ãªã¼ãã¼ãã¼ãã§å®ç¾ã§ãããããªãããã¨ããçåã¯æ®ãã®ã§ãããããªè¤éãªãã¨ããã¦ã¾ã§ä½ãããããã®ããã¨ããçåã¯æ®ãããã ããªã¼ãã¼ãã¼ãã ã¨ãè¨ç®ããå´ã®åãã¤ã¾ãã¬ã·ã¼ãã®å´ã®åã«å¦çãå®è£ ããããã©ãåã¯ã©ã¹ã¨åã¤ã³ã¹ã¿ã³ã¹ã®é¢ä¿ã ã¨ãè¨ç®ãããå´ããã¤ã¾ãããã©ã¡ã¼ã¿ãã®å´ã®åã«å¦çãå®è£ ããããããã¯è¨ãæ¹ãå¤ããã¨ããæ°ããåã«å¯¾å¿ãããããªã£ãã¨ãã«ããã®æ°ããåã®å´ã«å®è£ ãæ¸ãããã¨ãããã¨ã§ããããã®ã»ããããå¤æ´ã«å¯¾ãã¦éããã¦ããããæè»ã ãã責åã®ä¸ã§ãé©åãããããªãã¨æããã
ãã ããã®ãããã¿ã享åããããã«ããã¾ã§ã®ãã¨ãããªããã°ãªããªããã¨ãèããã¨ãããããããã¨ããããªãè¨èªä»æ§ã§åã¯ã©ã¹ããµãã¼ãããã¦ã Haskell 使ãã°ããããããªãã®â¦â¦ãã¨ããæ°æã¡ãããä¸ãããªãããã§ããªãâ¦â¦ãããªã«ãããããã®ããã¨ããé¨åã«å¯¾ãã¦ã¯ã¾ã ããããç¨åº¦ã®ç解度ãªã®ã§ãããå°ãèãã¦ã¿ããã¨æãã
追è¨ï¼
ãããããã¿ã¼ã³ä¸åãã£ããããããã®ã¯ã©ãã§ããããï¼ https://gist.github.com/Shinpeim/76c687b3c9a8f8126da0
ããã«ï¼
Scala ã® implicit parameter ã¯åã¯ã©ã¹ã®ä¸ç¨®ã¨ã¯ã©ããããã¨ãªã®ã - ç«åã®èé³æ©ã¯ 1 åéã« 45 åã«ããã¨é³´ã http://t.co/sJyavbZ7pj
æ£ç¢ºã«è¨ãã¨ãHaskellã®åã¯ã©ã¹ããªãã¸ã§ã¯ãæåè¨èªã§ããScalaã§å®ç¾
— Kota Mizushima (Aâe) (@kmizu) 2014, 6æ 30
ããããã«implicit parameterã¨ããæ©è½ãå°å
¥ããããã¨ãããã¨ã«ãªãã決ãã¦æ¬æ¥ã®æå³ãè¶
ãã¦æµç¨ãããããã§ã¯ãªããå
ã
ãã®ããã®æ©è½ã ã¨ãããã¨ãSee: Poor Manâs Type Classes http://t.co/CPqx2gmH4i
— Kota Mizushima (Aâe) (@kmizu) 2014, 6æ 30
ã¤ã¾ããæ©è½ã¨ãã¦ã¯åã¯ã©ã¹ã¨implicit parameterã¯å¯¾çã§ãã£ã¦ï¼implicit parameterã®æ¹ãå¾ã ãã§ãããã®ã®ï¼ããä¸ç¨®ãã¨ããã®ã¯ã¡ãã£ã¨éãã
— Kota Mizushima (Aâe) (@kmizu) 2014, 6æ 30
2014.10.9 1:11 追è¨
ãã³ã¡ãã
id:matarillo (ç¶ãè¨äºãèªã¿ã¾ããï¼C#/Javaçã«è¨ãã¨ãåã¯ã©ã¹ã¯åå¶ç´ãªãã§ããããã¨ããåãã¨ããåã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã«ãå¾ãããã§ãããã©ããã¯æ¬è³ªã§ã¯ãªãã¨ããç解ã
åå¶ç´ã¨ããã ããªãã° trait ã§ãããããªããã¨ãã話ã«ãªã£ã¦ãã¾ããããããåã¯ã©ã¹ãå°å ¥ããã¡ãªããããªãã®ã§ããã¯ãæ¢åã®åã«å¯¾ããæ¡å¼µãå¯è½ã¨ããã®ã¯åã¯ã©ã¹ã®æ¬è³ªï¼ã®ä¸é¨ï¼ã§ã¯ãªãããªãã¨ããç解ããããã¯ãã¦ãã¾ããå®éåã¯ã©ã¹ã®åå¨ããªã C#/Java ã§ãããµãã¿ã¤ãã³ã°ã§ã®åå¶ç´ã¯å®ç¾ã§ãã¦ããããã§ãããããªãããããåã¯ã©ã¹ãå°å ¥ããå¿ è¦ãããã®ããã¨ããè¦ç¹ããè¦ãã¨ããµãã¿ã¤ãã³ã°ã§ã¯å®ç¾ã§ããªãæè»ããå®ç¾ããå¿ è¦ãããããããªãã¨æãã¾ããããããããªããã ããããã¯ããããçç±ã§æ¬è³ªçã«ã¯åå¶ç´ã¨åçãªã®ã ãã¨ããæè¦ãããã°æ¯éåèã«ãããã®ã§æãã¦ãã ããã