본문으로 건너뛰기
cccskills
무료GitHub에 공개

principle-type-system-discipline

Apply when designing or reviewing Haskell types and signatures in NeoHaskell internals. Use algebraic data types, semantic newtypes, boundary parsing, exhaustive pattern matching, existing derivation, and total functions to express useful guarantees.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

neohaskell/NeoHaskell스타 348(GitHub 348 + cccskills 0)

실행 점수 미검증

설치 방법 보기

포함된 파일(2)

  • SKILL.md4.5 KB
  • agents/openai.yaml43 B

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Type System Discipline

Use GHC to reject impossible states, mismatched semantic values, and unhandled constructors. Prefer defining errors and special cases out of existence over proliferating handlers. This skill guides development of NeoHaskell's framework and language implementation. Public APIs should express useful guarantees without imposing unnecessary type machinery on callers.

  • Make illegal states unrepresentable. Use algebraic data types with a constructor for each valid case instead of records with contradictory combinations of fields. For example, data Completion = Open | Done DateTime ties the timestamp to the completed case; a Bool beside a Maybe DateTime permits inconsistent combinations. Put constructor-specific fields on that constructor and handle the cases with pattern matching.
  • Types are constructions, not restrictions. Build Haskell types from the values the operation needs instead of starting with a loose shape and scattering checks over it. A non-empty collection is a head plus a rest. Use data constructors or smart constructors to establish the required shape and expose the interface callers need on top.
  • Distinguish semantic primitives with newtypes. Use newtype, rather than a type synonym, when values with the same representation must not be interchangeable. The existing StreamId wrapper distinguishes an event stream identifier from arbitrary Text. A newtype does not validate its contents by itself. When a type promises a validated value, ensure its construction and decoding paths establish that invariant before trusting it downstream. Do not assume a derived instance or an exported constructor performs validation.
  • Parse external data into internal types. Turn raw Text/Bytes, JSON, CLI arguments, configuration, environment variables, protocol messages, and database rows into the typed model at their boundaries. Use Result error value for an explained failure or Maybe value for absence, according to the contract. Keep parsing pure where possible. The Boundary Discipline principle says where validation belongs.
  • Do not bypass GHC's guarantees. Do not use unsafeCoerce, partial pattern matches, undefined, or an error path to silence a type mismatch or pretend an invariant has been proved. Refine the data model, match the constructors, or validate the missing condition. A compiler-checked coerce establishes representational compatibility, not semantic validation. If an unsafe primitive is necessary at an implementation boundary, isolate it and state the invariant and evidence that justify it.
  • Make pattern matching exhaustive. Match the constructors of an ADT so GHC can identify affected callers when a constructor is added. Avoid catch-all patterns where a new constructor should force a decision. Incomplete-pattern warnings must fail the build: use -Wincomplete-patterns with -Werror, or -Werror=incomplete-patterns. The current core Cabal configuration already combines -Wall and -Werror; do not weaken that policy to get a change through.
  • Derive from the authoritative model. Reuse existing Generic derivation, Template Haskell generators, and typeclass instances instead of maintaining parallel declarations by hand. In NeoHaskell, a Haskell type can own the shape and generate a Schema through ToSchema; preserve that direction when the type is the authority. If an external schema owns the shape, derive the Haskell representation from it instead. See the Encode Lessons in Structure principle.
  • Strengthen types where partiality appears, then stop. A partial match, runtime assertion, or "this should never happen" failure can reveal a missing case or precondition. Express the useful guarantee in the input type or handle the case explicitly in the result. An operation that promises a first element needs non-empty input; Array.first and LinkedList.head already return Maybe and can keep ordinary collection inputs. Prefer total functions. If the existing contract handles every case, keep the plain type rather than adding type-level machinery just to describe more facts.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

architect

무료

Sketch types, signatures, and module structure before code, then stay in the loop while implementation fills in. Use for /architect, 'architect this', 'design this', or non-trivial work where jumping to code would lock in the wrong shape.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

neohaskell/NeoHaskell3482026년 10월 26일 업데이트

arena

무료

Spawn N parallel candidates at the same task, pick a base, graft the strongest parts of the losers into it. Use for /arena, 'arena this', 'throw it in the arena', or when one attempt at a non-trivial artifact would lock in the wrong shape.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

neohaskell/NeoHaskell3482026년 10월 26일 업데이트

babysit

무료

Inspect or supervise a PR or stack through review and CI to merge-ready, using current GitHub evidence and the requested mode.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

neohaskell/NeoHaskell3482026년 10월 26일 업데이트

Vet a perf measurement (limiter, tuning, limits, errors, repeatability, relevance, and whether the work happened) before you report or act on it. Use when you benchmark or report a measured speedup or regression, including complete framework flows and compilation of projects that consume the framework.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

neohaskell/NeoHaskell3482026년 10월 26일 업데이트

bro

무료

Restate the last message in plain human language, with no jargon.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

neohaskell/NeoHaskell3482026년 10월 26일 업데이트

Build or adapt a local harness to drive, inspect, and profile an interactive CLI or TUI without external services. Use for CLI UX checks, startup regressions, memory leaks, hangs, prompt flows, or terminal demos.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

neohaskell/NeoHaskell3482026년 10월 26일 업데이트

neohaskell의 스킬 모두 보기

이 스킬의 문제 신고