[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KHD36377PQAMC8W10F3VCY":3,"skill-same:01M6KHD36377PQAMC8W10F3VCY":60},{"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":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":43,"ownerHtmlUrl":44,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":45,"install":46,"resources":59},"01M6KHD36377PQAMC8W10F3VCY","python-to-scala-translation-patterns",null,"Use when translating Python OOP\u002Ffunctional code to idiomatic Scala 2.13, covering class hierarchies, enumerations, error handling, and naming conventions","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\u002Fb3-teacher-feedback-claude-sonnet-4-6\u002Fpython-scala-translation\u002Frun1_python-to-scala-translation-patterns\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32],"python","scala","translation","patterns","python to scala translation patterns","code","error handling","oop","use","conventions","error","functional","naming","naming conventions","idiomatic","2026-11-10 10:12:30",false,"---\nname: python-to-scala-translation-patterns\ndescription: Use when translating Python OOP\u002Ffunctional code to idiomatic Scala 2.13, covering class hierarchies, enumerations, error handling, and naming conventions\n---\n\n# Python to Scala Translation Patterns\n\n## Class and Object Hierarchy\n\n### Enumerations\nPython `Enum` → Scala `sealed trait` + `case object`:\n```scala\n\u002F\u002F Python\nclass TokenType(Enum):\n    STRING = \"string\"\n    NUMERIC = \"numeric\"\n\n\u002F\u002F Scala\nsealed trait TokenType\nobject TokenType {\n  case object String  extends TokenType\n  case object Numeric extends TokenType\n  \u002F\u002F companion object provides namespace\n}\n```\n\n### Abstract Base Classes\nPython `ABC` \u002F abstract methods → Scala `abstract class` or `trait`:\n```scala\n\u002F\u002F Python\nclass BaseTokenizer(ABC):\n    @abstractmethod\n    def tokenize(self, text: str) -> List[Token]: ...\n\n\u002F\u002F Scala\nabstract class BaseTokenizer {\n  def tokenize(text: String): List[Token]\n}\n\u002F\u002F OR as a trait (preferred for mixin composition)\ntrait BaseTokenizer {\n  def tokenize(text: String): List[Token]\n}\n```\n\n### Data Classes \u002F Named Tuples\nPython `@dataclass` \u002F `NamedTuple` → Scala `case class`:\n```scala\n\u002F\u002F Python\n@dataclass\nclass Token:\n    value: str\n    token_type: TokenType\n    metadata: dict = field(default_factory=dict)\n\n\u002F\u002F Scala\ncase class Token(\n  value: String,\n  tokenType: TokenType,\n  metadata: Map[String, Any] = Map.empty\n)\n```\n\n## Naming Conventions\n\n| Concept | Python | Scala |\n|---------|--------|-------|\n| Class | `PascalCase` | `PascalCase` |\n| Method\u002Ffield | `snake_case` | `camelCase` |\n| Constant | `UPPER_SNAKE` | `UpperCamelCase` or `camelCase val` |\n| Package | `lowercase` | `lowercase` |\n| Type param | `T` | `T` |\n\n```scala\n\u002F\u002F Python: token_type, is_valid, to_token\n\u002F\u002F Scala: tokenType, isValid, toToken\n```\n\n## Optional \u002F None Handling\nPython `Optional[T]` \u002F `None` → Scala `Option[T]`:\n```scala\n\u002F\u002F Python\ndef find(text: str) -> Optional[Token]:\n    if condition: return Token(...)\n    return None\n\n\u002F\u002F Scala\ndef find(text: String): Option[Token] =\n  if (condition) Some(Token(...)) else None\n```\n\n## Error Handling\nPython `try\u002Fexcept` with custom exceptions → Scala `Try`, `Either`, or `Option`:\n```scala\nimport scala.util.{Try, Success, Failure}\n\n\u002F\u002F Python\ntry:\n    result = risky()\nexcept ValueError as e:\n    return None\n\n\u002F\u002F Scala — Try\ndef risky(): Try[Token] = Try { \u002F* may throw *\u002F }\n\n\u002F\u002F Scala — Either for typed errors\ndef parse(s: String): Either[String, Token] =\n  if (valid(s)) Right(Token(s, ...))\n  else Left(s\"Invalid input: $s\")\n```\n\n## Collections\n| Python | Scala |\n|--------|-------|\n| `list` | `List[T]` or `Seq[T]` |\n| `dict` | `Map[K, V]` |\n| `set` | `Set[T]` |\n| `tuple` | `(A, B)` or `case class` |\n| `List[str]` | `List[String]` |\n| `Dict[str, Any]` | `Map[String, Any]` |\n\n```scala\n\u002F\u002F Python: [t for t in tokens if t.value != \"\"]\n\u002F\u002F Scala:\ntokens.filter(_.value.nonEmpty)\n\n\u002F\u002F Python: [f(x) for x in xs]\n\u002F\u002F Scala:\nxs.map(f)\n\n\u002F\u002F Python: sum(len(t.value) for t in tokens)\n\u002F\u002F Scala:\ntokens.map(_.value.length).sum\n```\n\n## Companion Objects (replacing Python class methods \u002F static methods)\n```scala\n\u002F\u002F Python @classmethod or @staticmethod\nclass Token:\n    @staticmethod\n    def from_string(s: str) -> Token: ...\n\n\u002F\u002F Scala companion object\ncase class Token(value: String, tokenType: TokenType)\nobject Token {\n  def fromString(s: String): Token = ...\n}\n```\n\n## Pattern Matching (replaces isinstance \u002F match)\n```scala\n\u002F\u002F Python\nif isinstance(x, StringTokenizer): ...\nelif isinstance(x, NumericTokenizer): ...\n\n\u002F\u002F Scala\nx match {\n  case _: StringTokenizer  => ...\n  case _: NumericTokenizer => ...\n}\n\n\u002F\u002F On sealed traits\ntokenType match {\n  case TokenType.String  => ...\n  case TokenType.Numeric => ...\n}\n```\n\n## Default Parameters and Named Arguments\n```scala\n\u002F\u002F Python\ndef tokenize(text: str, lower: bool = True) -> List[Token]: ...\ntokenize(\"Hello\", lower=False)\n\n\u002F\u002F Scala\ndef tokenize(text: String, lower: Boolean = true): List[Token] = ...\ntokenize(\"Hello\", lower = false)\n```","# Python to Scala Translation Patterns\n\n## Class and Object Hierarchy\n\n### Enumerations\nPython `Enum` → Scala `sealed trait` + `case object`:\n```scala\n\u002F\u002F Python\nclass TokenType(Enum):\n    STRING = \"string\"\n    NUMERIC = \"numeric\"\n\n\u002F\u002F Scala\nsealed trait TokenType\nobject TokenType {\n  case object String  extends TokenType\n  case object Numeric extends TokenType\n  \u002F\u002F companion object provides namespace\n}\n```\n\n### Abstract Base Classes\nPython `ABC` \u002F abstract methods → Scala `abstract class` or `trait`:\n```scala\n\u002F\u002F Python\nclass BaseTokenizer(ABC):\n    @abstractmethod\n    def tokenize(self, text: str) -> List[Token]: ...\n\n\u002F\u002F Scala\nabstract class BaseTokenizer {\n  def tokenize(text: String): List[Token]\n}\n\u002F\u002F OR as a trait (preferred for mixin composition)\ntrait BaseTokenizer {\n  def tokenize(text: String): List[Token]\n}\n```\n\n### Data Classes \u002F Named Tuples\nPython `@dataclass` \u002F `NamedTuple` → Scala `case class`:\n```scala\n\u002F\u002F Python\n@dataclass\nclass Token:\n    value: str\n    token_type: TokenType\n    metadata: dict = field(default_factory=dict)\n\n\u002F\u002F Scala\ncase class Token(\n  value: String,\n  tokenType: TokenType,\n  metadata: Map[String, Any] = Map.empty\n)\n```\n\n## Naming Conventions\n\n| Concept | Python | Scala |\n|---------|--------|-------|\n| Class | `PascalCase` | `PascalCase` |\n| Method\u002Ffield | `snake_case` | `camelCase` |\n| Constant | `UPPER_SNAKE` | `UpperCamelCase` or `camelCase val` |\n| Package | `lowercase` | `lowercase` |\n| Type param | `T` | `T` |\n\n```scala\n\u002F\u002F Python: token_type, is_valid, to_token\n\u002F\u002F Scala: tokenType, isValid, toToken\n```\n\n## Optional \u002F None Handling\nPython `Optional[T]` \u002F `None` → Scala `Option[T]`:\n```scala\n\u002F\u002F Python\ndef find(text: str) -> Optional[Token]:\n    if condition: return Token(...)\n    return None\n\n\u002F\u002F Scala\ndef find(text: String): Option[Token] =\n  if (condition) Some(Token(...)) else None\n```\n\n## Error Handling\nPython `try\u002Fexcept` with custom exceptions → Scala `Try`, `Either`, or `Option`:\n```scala\nimport scala.util.{Try, Success, Failure}\n\n\u002F\u002F Python\ntry:\n    result = risky()\nexcept ValueError as e:\n    return None\n\n\u002F\u002F Scala — Try\ndef risky(): Try[Token] = Try { \u002F* may throw *\u002F }\n\n\u002F\u002F Scala — Either for typed errors\ndef parse(s: String): Either[String, Token] =\n  if (valid(s)) Right(Token(s, ...))\n  else Left(s\"Invalid input: $s\")\n```\n\n## Collections\n| Python | Scala |\n|--------|-------|\n| `list` | `List[T]` or `Seq[T]` |\n| `dict` | `Map[K, V]` |\n| `set` | `Set[T]` |\n| `tuple` | `(A, B)` or `case class` |\n| `List[str]` | `List[String]` |\n| `Dict[str, Any]` | `Map[String, Any]` |\n\n```scala\n\u002F\u002F Python: [t for t in tokens if t.value != \"\"]\n\u002F\u002F Scala:\ntokens.filter(_.value.nonEmpty)\n\n\u002F\u002F Python: [f(x) for x in xs]\n\u002F\u002F Scala:\nxs.map(f)\n\n\u002F\u002F Python: sum(len(t.value) for t in tokens)\n\u002F\u002F Scala:\ntokens.map(_.value.length).sum\n```\n\n## Companion Objects (replacing Python class methods \u002F static methods)\n```scala\n\u002F\u002F Python @classmethod or @staticmethod\nclass Token:\n    @staticmethod\n    def from_string(s: str) -> Token: ...\n\n\u002F\u002F Scala companion object\ncase class Token(value: String, tokenType: TokenType)\nobject Token {\n  def fromString(s: String): Token = ...\n}\n```\n\n## Pattern Matching (replaces isinstance \u002F match)\n```scala\n\u002F\u002F Python\nif isinstance(x, StringTokenizer): ...\nelif isinstance(x, NumericTokenizer): ...\n\n\u002F\u002F Scala\nx match {\n  case _: StringTokenizer  => ...\n  case _: NumericTokenizer => ...\n}\n\n\u002F\u002F On sealed traits\ntokenType match {\n  case TokenType.String  => ...\n  case TokenType.Numeric => ...\n}\n```\n\n## Default Parameters and Named Arguments\n```scala\n\u002F\u002F Python\ndef tokenize(text: str, lower: bool = True) -> List[Token]: ...\ntokenize(\"Hello\", lower=False)\n\n\u002F\u002F Scala\ndef tokenize(text: String, lower: Boolean = true): List[Token] = ...\ntokenize(\"Hello\", lower = false)\n```",{"name":5,"description":7},"main","726e1f79b96b0cb3d729d0e55a1c847e0b5353ae","skills\u002Fb3-teacher-feedback-claude-sonnet-4-6\u002Fpython-scala-translation\u002Frun1_python-to-scala-translation-patterns",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":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add cxcscmu\u002FSkillLearnBench --skill python-to-scala-translation-patterns",{"tool":52,"command":53},"bunx","bunx skills add cxcscmu\u002FSkillLearnBench --skill python-to-scala-translation-patterns",{"tool":55,"command":56},"pnpm","pnpm dlx skills add cxcscmu\u002FSkillLearnBench --skill python-to-scala-translation-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb3-teacher-feedback-claude-sonnet-4-6\u002Fpython-scala-translation\u002Frun1_python-to-scala-translation-patterns\u002FSKILL.md",true,[],[61,79,104,122,142,154],{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":72,"publishedAt":33},"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",[67],{"categoryNo":68,"categoryName":69,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[73,74,75,76,77,78],"object counter","object","vision","computer","Computer Vision","image",{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":88,"publishedAt":33},"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",[85],{"categoryNo":86,"categoryName":87,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000023","Skill与智能体开发",[89,90,91,92,93,94,95,96,97,98,99,100,101,102,103],"workflow","planning","planning workflow","travel","travel planning","travel planning workflow","structured","performing","plan","for","user","it","requirements","essential","itineraries",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":33},"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",[],[111,112,113,114,115,116,117,92,118,119,93,120,98,121,90],"search","tool","dataset","bundled dataset search tool","restaurants","Tools","up","look","flights","you","database",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":33},"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",[],[129,130,131,98,132,133,134,135,136,137,138,139,120,140,141],"glm output","output","glm","tasks","metrics","json","basics","guidance","matching","verifier","processing","root","calibration",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":149,"publishedAt":33},"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",[148],{"categoryNo":86,"categoryName":87,"taxonomyType":70,"taxonomyTypeDesc":71},[150,141,131,130,136,135,132,151,152,98,153],"glm calibration","setup","companion","metric",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":33},"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",[],[161,131,135,162,150,141,98,130,163,164,165,26,166,167,132],"glm basics","inspect","relevant","files","good","how","Evaluation"]