[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KFVC2B47C56FS3FD3EFNAM":3,"skill-same:01M6KFVC2B47C56FS3FD3EFNAM":53},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":26,"linkOnly":27,"markdownContent":28,"markdownBody":29,"frontMatter":30,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":34,"repositoryHtmlUrl":35,"repositoryHomepageUrl":36,"ownerHtmlUrl":37,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":38,"install":39,"resources":52},"01M6KFVC2B47C56FS3FD3EFNAM","run2_scala-type-classes",null,"Translating Python Protocol, ABC, and isinstance dispatch to Scala traits, overloaded methods, and functor\u002Fmonad abstractions.","cxcscmu\u002FSkillLearnBench","cxcscmu","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F142838272?v=4","01M6KCQDFQWPDSN0MKZY96MSQP","01M6KCQDM7G70TKJ28NTSQC0RZ",92,"MIT","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb2-self-feedback-claude-sonnet-4-6\u002Fpython-scala-translation\u002Frun2_scala-type-classes\u002FSKILL.md",[],[18,19,20,21,22,23,24,25],"scala","type","run2 scala type classes","python","protocol","dispatch","methods","traits","2026-11-10 10:12:30",false,"---\nname: run2_scala-type-classes\ndescription: Translating Python Protocol, ABC, and isinstance dispatch to Scala traits, overloaded methods, and functor\u002Fmonad abstractions.\n---\n\n# Scala Traits, Overloading, and Functors (vs Python Protocol\u002FABC\u002Fisinstance)\n\n## Python Protocol → Scala Trait\n\nPython structural typing (duck typing):\n```python\n@runtime_checkable\nclass Tokenizable(Protocol):\n    def to_token(self) -> str: ...\n```\n\nScala uses **nominal typing** — classes must explicitly declare `extends Tokenizable`:\n```scala\ntrait Tokenizable {\n  def toToken: String\n}\n```\n\n- No `@runtime_checkable` — Scala trait membership is checked at compile time\n- Method name convention: `toToken` (camelCase) not `to_token`\n\n## Python ABC → Scala Abstract Class\n\n```python\nclass BaseTokenizer(ABC, Generic[T]):\n    @abstractmethod\n    def tokenize(self, value: T) -> Token: ...\n    def tokenize_batch(self, values: Iterable[T]) -> Iterator[Token]:\n        for v in values: yield self.tokenize(v)\n```\n\n```scala\nabstract class BaseTokenizer[T] {\n  def tokenize(value: T): Token                          \u002F\u002F abstract (no body)\n  def tokenizeBatch(values: Iterable[T]): Iterator[Token] =\n    values.iterator.map(tokenize)                        \u002F\u002F concrete default\n}\n```\n\n- Methods without body are abstract — no `@abstractmethod` annotation needed\n- `values.iterator.map(tokenize)` is lazy — same semantics as Python generator\n\n## Python isinstance Dispatch → Scala Method Overloading\n\nPython runtime dispatch with type checks:\n```python\ndef tokenize(self, value: Any) -> Token:\n    if value is None: return Token(\"NULL\", TokenType.NULL)\n    if isinstance(value, (str, bytes)): return self._string_tokenizer.tokenize(value)\n    if isinstance(value, (int, float, Decimal)): return self._numeric_tokenizer.tokenize(value)\n    if isinstance(value, (datetime, date)): return self._temporal_tokenizer.tokenize(value)\n```\n\nScala compile-time overloading:\n```scala\nfinal class UniversalTokenizer {\n  private val stringTokenizer   = new StringTokenizer()\n  private val numericTokenizer  = new NumericTokenizer()\n  private val temporalTokenizer = new TemporalTokenizer()\n\n  def tokenize(value: String):        Token = stringTokenizer.tokenize(value)\n  def tokenize(value: Array[Byte]):   Token = stringTokenizer.tokenizeBytes(value)\n  def tokenize(value: Int):           Token = numericTokenizer.tokenizeInt(value)\n  def tokenize(value: Double):        Token = numericTokenizer.tokenizeDouble(value)\n  def tokenize(value: BigDecimal):    Token = numericTokenizer.tokenize(value)\n  def tokenize(value: LocalDateTime): Token = temporalTokenizer.tokenize(value)\n  def tokenize(value: LocalDate):     Token = temporalTokenizer.tokenizeDate(value)\n  def tokenize(value: Tokenizable):   Token = Token(value.toToken, TokenType.STRUCTURED)\n  def tokenizeNull: Token = Token(\"NULL\", TokenType.NULL)   \u002F\u002F null has no value in Scala\n}\n```\n\n- Each overload is resolved at compile time — no runtime overhead\n- `None` → `tokenizeNull` (separate method, since Scala `null` is not a type)\n\n## TokenFunctor and TokenMonad\n\n```scala\nclass TokenFunctor[T](private val _value: T) {\n  def get: T = _value\n  def map[B](f: T => B): TokenFunctor[B]           = new TokenFunctor(f(_value))\n  def flatMap[B](f: T => TokenFunctor[B]): TokenFunctor[B] = f(_value)\n  def getOrElse[B >: T](default: => B): B = Option(_value).getOrElse(default)\n}\n```\n\nKey improvements over Python:\n- `map` and `flatMap` are properly typed with `B` — not `Any`\n- `get` is the primary value accessor\n- `getOrElse` uses call-by-name `default` — only evaluated if needed\n- `[B >: T]` lower bound in `getOrElse` preserves type safety\n\n```scala\nclass TokenMonad[T](value: T) extends TokenFunctor[T](value) {\n  def ap[B](funcWrapped: TokenMonad[T => B]): TokenMonad[B] =\n    new TokenMonad(funcWrapped.get(get))\n}\n\nobject TokenMonad {\n  def pure[T](value: T): TokenMonad[T] = new TokenMonad(value)\n}\n```\n\n- `pure` lives in companion object — replaces Python `@classmethod`\n- `ap` properly typed: accepts `TokenMonad[T => B]`, returns `TokenMonad[B]`\n\n## TokenRegistry: Handler Pipeline\n\nPython `for\u002Felse` semantics (first successful handler wins):\n```python\nfor handler in self._handlers:\n    result = handler(item)\n    if result is not None:\n        results.append(result); break\nelse:\n    results.append(None)\n```\n\nScala with lazy iterator short-circuit:\n```scala\nhandlers.iterator.flatMap(h => h(item)).nextOption()\n```\n\n- `h(item)` returns `Option[Token]`\n- `flatMap` on `Iterator[Option[Token]]` flattens to `Iterator[Token]`, skipping `None`\n- `.nextOption()` takes only the first result — lazy, so remaining handlers NOT evaluated\n- Returns `Option[Token]` — `None` if all handlers returned `None`\n","# Scala Traits, Overloading, and Functors (vs Python Protocol\u002FABC\u002Fisinstance)\n\n## Python Protocol → Scala Trait\n\nPython structural typing (duck typing):\n```python\n@runtime_checkable\nclass Tokenizable(Protocol):\n    def to_token(self) -> str: ...\n```\n\nScala uses **nominal typing** — classes must explicitly declare `extends Tokenizable`:\n```scala\ntrait Tokenizable {\n  def toToken: String\n}\n```\n\n- No `@runtime_checkable` — Scala trait membership is checked at compile time\n- Method name convention: `toToken` (camelCase) not `to_token`\n\n## Python ABC → Scala Abstract Class\n\n```python\nclass BaseTokenizer(ABC, Generic[T]):\n    @abstractmethod\n    def tokenize(self, value: T) -> Token: ...\n    def tokenize_batch(self, values: Iterable[T]) -> Iterator[Token]:\n        for v in values: yield self.tokenize(v)\n```\n\n```scala\nabstract class BaseTokenizer[T] {\n  def tokenize(value: T): Token                          \u002F\u002F abstract (no body)\n  def tokenizeBatch(values: Iterable[T]): Iterator[Token] =\n    values.iterator.map(tokenize)                        \u002F\u002F concrete default\n}\n```\n\n- Methods without body are abstract — no `@abstractmethod` annotation needed\n- `values.iterator.map(tokenize)` is lazy — same semantics as Python generator\n\n## Python isinstance Dispatch → Scala Method Overloading\n\nPython runtime dispatch with type checks:\n```python\ndef tokenize(self, value: Any) -> Token:\n    if value is None: return Token(\"NULL\", TokenType.NULL)\n    if isinstance(value, (str, bytes)): return self._string_tokenizer.tokenize(value)\n    if isinstance(value, (int, float, Decimal)): return self._numeric_tokenizer.tokenize(value)\n    if isinstance(value, (datetime, date)): return self._temporal_tokenizer.tokenize(value)\n```\n\nScala compile-time overloading:\n```scala\nfinal class UniversalTokenizer {\n  private val stringTokenizer   = new StringTokenizer()\n  private val numericTokenizer  = new NumericTokenizer()\n  private val temporalTokenizer = new TemporalTokenizer()\n\n  def tokenize(value: String):        Token = stringTokenizer.tokenize(value)\n  def tokenize(value: Array[Byte]):   Token = stringTokenizer.tokenizeBytes(value)\n  def tokenize(value: Int):           Token = numericTokenizer.tokenizeInt(value)\n  def tokenize(value: Double):        Token = numericTokenizer.tokenizeDouble(value)\n  def tokenize(value: BigDecimal):    Token = numericTokenizer.tokenize(value)\n  def tokenize(value: LocalDateTime): Token = temporalTokenizer.tokenize(value)\n  def tokenize(value: LocalDate):     Token = temporalTokenizer.tokenizeDate(value)\n  def tokenize(value: Tokenizable):   Token = Token(value.toToken, TokenType.STRUCTURED)\n  def tokenizeNull: Token = Token(\"NULL\", TokenType.NULL)   \u002F\u002F null has no value in Scala\n}\n```\n\n- Each overload is resolved at compile time — no runtime overhead\n- `None` → `tokenizeNull` (separate method, since Scala `null` is not a type)\n\n## TokenFunctor and TokenMonad\n\n```scala\nclass TokenFunctor[T](private val _value: T) {\n  def get: T = _value\n  def map[B](f: T => B): TokenFunctor[B]           = new TokenFunctor(f(_value))\n  def flatMap[B](f: T => TokenFunctor[B]): TokenFunctor[B] = f(_value)\n  def getOrElse[B >: T](default: => B): B = Option(_value).getOrElse(default)\n}\n```\n\nKey improvements over Python:\n- `map` and `flatMap` are properly typed with `B` — not `Any`\n- `get` is the primary value accessor\n- `getOrElse` uses call-by-name `default` — only evaluated if needed\n- `[B >: T]` lower bound in `getOrElse` preserves type safety\n\n```scala\nclass TokenMonad[T](value: T) extends TokenFunctor[T](value) {\n  def ap[B](funcWrapped: TokenMonad[T => B]): TokenMonad[B] =\n    new TokenMonad(funcWrapped.get(get))\n}\n\nobject TokenMonad {\n  def pure[T](value: T): TokenMonad[T] = new TokenMonad(value)\n}\n```\n\n- `pure` lives in companion object — replaces Python `@classmethod`\n- `ap` properly typed: accepts `TokenMonad[T => B]`, returns `TokenMonad[B]`\n\n## TokenRegistry: Handler Pipeline\n\nPython `for\u002Felse` semantics (first successful handler wins):\n```python\nfor handler in self._handlers:\n    result = handler(item)\n    if result is not None:\n        results.append(result); break\nelse:\n    results.append(None)\n```\n\nScala with lazy iterator short-circuit:\n```scala\nhandlers.iterator.flatMap(h => h(item)).nextOption()\n```\n\n- `h(item)` returns `Option[Token]`\n- `flatMap` on `Iterator[Option[Token]]` flattens to `Iterator[Token]`, skipping `None`\n- `.nextOption()` takes only the first result — lazy, so remaining handlers NOT evaluated\n- Returns `Option[Token]` — `None` if all handlers returned `None`\n",{"name":5,"description":7},"main","726e1f79b96b0cb3d729d0e55a1c847e0b5353ae","skills\u002Fb2-self-feedback-claude-sonnet-4-6\u002Fpython-scala-translation\u002Frun2_scala-type-classes",7,"https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench","https:\u002F\u002Fcxcscmu.github.io\u002FSkillLearnBench","https:\u002F\u002Fgithub.com\u002Fcxcscmu","2026-10-02 22:55:36",{"source":8,"skillName":5,"commands":40,"prompt":50,"zipAvailable":51},[41,44,47],{"tool":42,"command":43},"npx","npx skills add cxcscmu\u002FSkillLearnBench --skill run2_scala-type-classes",{"tool":45,"command":46},"bunx","bunx skills add cxcscmu\u002FSkillLearnBench --skill run2_scala-type-classes",{"tool":48,"command":49},"pnpm","pnpm dlx skills add cxcscmu\u002FSkillLearnBench --skill run2_scala-type-classes","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb2-self-feedback-claude-sonnet-4-6\u002Fpython-scala-translation\u002Frun2_scala-type-classes\u002FSKILL.md",true,[],[54,72,97,115,135,147],{"skillNo":55,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":65,"publishedAt":26},"01M6KM5KH175P5ABP5JMX2SBDQ","object_counter","Count occurrences of an object in the image using computer vision algorithm.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Fvideo-object-counting\u002Fobject_counter\u002FSKILL.md",[60],{"categoryNo":61,"categoryName":62,"taxonomyType":63,"taxonomyTypeDesc":64},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[66,67,68,69,70,71],"object counter","object","vision","computer","Computer Vision","image",{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":81,"publishedAt":26},"01M6KM51TMVXG79MMPCS6Y8G86","travel-planning-workflow","Invoke this skill when performing travel planning. It defines a structured workflow for generating itineraries. Following this workflow is essential to ensure the final plan satisfies user requirements.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftravel-planning\u002Ftravel-planning-workflow\u002FSKILL.md",[78],{"categoryNo":79,"categoryName":80,"taxonomyType":63,"taxonomyTypeDesc":64},"01JBSEEDCAT000000000000023","Skill与智能体开发",[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96],"workflow","planning","planning workflow","travel","travel planning","travel planning workflow","structured","performing","plan","for","user","it","requirements","essential","itineraries",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":26},"01M6KM4DY820XHS9YTSK5QP5HD","bundled-dataset-search-tool","invoke this skill when you need to perform database search for travel planning. This skill provides some useful pre-packaged tools to look up accommodations, attractions, cities, driving distance, flights, and restaurants from the bundled dataset.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftravel-planning\u002Fbundled-dataset-search-tool\u002FSKILL.md",[],[104,105,106,107,108,109,110,85,111,112,86,113,91,114,83],"search","tool","dataset","bundled dataset search tool","restaurants","Tools","up","look","flights","you","database",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":26},"01M6KM465BB9PQ0B548HQSVAWZ","glm-output","Output-processing guidance for GLM tasks. Especially useful after glm-basics and glm-calibration when you need verifier-matching metrics from output.nc and a final \u002Froot\u002Fmetrics.json.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-output\u002FSKILL.md",[],[122,123,124,91,125,126,127,128,129,130,131,132,113,133,134],"glm output","output","glm","tasks","metrics","json","basics","guidance","matching","verifier","processing","root","calibration",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":142,"publishedAt":26},"01M6KM40KY3QWDW5W97S39R2BC","glm-calibration","Calibration guidance for GLM tasks. Often most effective after glm-basics has clarified the setup; glm-output is the companion skill for exact final metric computation.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-calibration\u002FSKILL.md",[141],{"categoryNo":79,"categoryName":80,"taxonomyType":63,"taxonomyTypeDesc":64},[143,134,124,123,129,128,125,144,145,91,146],"glm calibration","setup","companion","metric",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":26},"01M6KM3VHHVSGMGHJQB3PPT6YG","glm-basics","A good starting point for GLM calibration tasks. Use to inspect glm3.nml, confirm how GLM runs, and identify the relevant files before moving on to calibration and output evaluation.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-basics\u002FSKILL.md",[],[154,124,128,155,143,134,91,123,156,157,158,159,160,161,125],"glm basics","inspect","relevant","files","good","use","how","Evaluation"]