跳到正文
cccskills
免费在 GitHub 公开

fsharp

Write, review, or modernize F# code in .NET repositories with functional-first design, algebraic data types, pattern matching, pipelines, async workflows, project ordering, and C# interop. USE FOR: F# .fs/.fsproj code; discriminated unions, records, options, results, pattern matching, computation expressions, or functional domain modeling; strongly typed AI-generated .NET code. DO NOT USE FOR: C# language modernization; FSI-only exploratory scripts with no project changes. INVOKES: inspect .fsproj file order and SDK settings, edit F# source and project files, and run dotnet build/test or dotnet fsi validation commands when changes are made.

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(2)

  • SKILL.md7.6 KB
  • manifest.json86 B

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

F# for .NET

Trigger On

  • the task touches .fs, .fsx, .fsi, or .fsproj files
  • domain logic benefits from records, discriminated unions, options, results, or exhaustive pattern matching
  • generated code needs a strongly typed functional model instead of nullable primitive state
  • F# code must interoperate with C# or other .NET libraries
  • the repository needs project setup, source ordering, or validation for F# code

Do Not Use For

  • C# language feature selection; use modern-csharp
  • analyzer-only, formatter-only, or CI-only work with no F# language decisions
  • one-off REPL or scripting exploration that does not affect project code; use fsi
  • non-.NET functional languages

Project Setup

Use the .NET SDK templates when adding F# projects.

dotnet new classlib -lang "F#" -o src/Domain
dotnet new console -lang "F#" -o src/App
dotnet new xunit -lang "F#" -o tests/Domain.Tests
dotnet sln add src/Domain/Domain.fsproj tests/Domain.Tests/Domain.Tests.fsproj
dotnet add tests/Domain.Tests/Domain.Tests.fsproj reference src/Domain/Domain.fsproj
dotnet build

FSharp.Core is normally supplied by the F# SDK project. Add or pin it explicitly only when the repo has a package policy that requires deterministic package versions.

dotnet add src/Domain/Domain.fsproj package FSharp.Core

Source Ordering

F# compiles files in the order listed in the project file. Define types and modules before files that consume them.

<ItemGroup>
  <Compile Include="Domain.fs" />
  <Compile Include="Validation.fs" />
  <Compile Include="Program.fs" />
</ItemGroup>

When adding a file, update the .fsproj intentionally. Do not assume wildcard ordering.

Workflow

  1. Inspect the existing .fsproj, .fs, .fsi, and .fsx files to determine compile order, public boundaries, and whether the code is F#-first or C#-facing.
  2. Choose the smallest F# model that represents the invariant: records for named product data, discriminated unions for closed state, option for absence, and Result for expected failures.
  3. Add or edit source files in dependency order, then update the .fsproj compile list before consumers reference the new code.
  4. Review public API shape for .NET interop. Translate F#-specific internal models to DTOs, methods, or Try* patterns when C# callers need a stable surface.
  5. Run dotnet build, targeted tests, and any relevant dotnet fsi probes before returning the final result.

Current Upstream Notes

  • The August 2026 F# overview continues to emphasize functional-first programming on .NET with records, discriminated unions, pattern matching, units of measure, type providers, and interop. Keep F# guidance domain-model oriented rather than translating C# object patterns mechanically.
  • Use fsi for exploratory scripts, but move durable code into ordered .fsproj files before it becomes production behavior.

Practical Patterns

Model State With Records And Unions

Prefer a type that names every valid state over loose strings, nullable values, or parallel booleans.

module Orders

type OrderId = private OrderId of string

module OrderId =
    let tryCreate value =
        if System.String.IsNullOrWhiteSpace value then
            Error "Order id is required."
        else
            Ok (OrderId value)

type Payment =
    | Card of last4: string
    | Wire of iban: string
    | PurchaseOrder of number: string

type Order =
    { Id: OrderId
      Customer: string
      Payment: Payment }

let describePayment payment =
    match payment with
    | Card last4 -> $"card ending {last4}"
    | Wire iban -> $"wire transfer {iban}"
    | PurchaseOrder number -> $"purchase order {number}"

Compose Validation With Result

Return Result<'T,'Error> when callers must handle failure and when failures are part of the domain.

module Pricing

type Price =
    private
    | Price of decimal

module Price =
    let tryCreate amount =
        if amount < 0m then
            Error "Price cannot be negative."
        else
            Ok (Price amount)

    let value (Price amount) = amount

type Line =
    { Sku: string
      Quantity: int
      UnitPrice: Price }

let tryCreateLine sku quantity amount =
    match Price.tryCreate amount with
    | Ok price when quantity > 0 ->
        Ok { Sku = sku; Quantity = quantity; UnitPrice = price }
    | Ok _ ->
        Error "Quantity must be positive."
    | Error message ->
        Error message

Read And Transform Data

Use pipelines for readable transformations, but stop before the pipeline hides error handling or allocation cost.

open System.IO

let readActiveUsers path =
    File.ReadLines path
    |> Seq.skip 1
    |> Seq.choose (fun line ->
        match line.Split(',') with
        | [| id; name; "active" |] -> Some {| Id = id; Name = name |}
        | _ -> None)
    |> Seq.toList

Write A Small .NET Boundary

Make public interop APIs easy for C# callers. Hide F#-specific details behind functions, methods, or DTO records when needed.

namespace Company.Domain

type InvoiceDto =
    { Id: string
      Total: decimal
      IsPaid: bool }

module Invoice =
    let markPaid invoice =
        { invoice with IsPaid = true }

Interop Guidance

  • Keep F# discriminated unions inside F# boundaries unless C# consumers are expected to understand their generated shape.
  • Use records or explicit classes for public cross-language DTOs.
  • Use option internally; translate to nullable annotations, Try* methods, or Result at C#-first public boundaries.
  • Avoid throwing for expected domain failures. Use exceptions for unexpected infrastructure failures.
  • Prefer task { } or Task-returning APIs at .NET interop boundaries; use Async<'T> when the code is F#-first.

Review Checklist

  • The .fsproj compile order matches dependency order.
  • All union cases are handled explicitly; wildcard branches are justified.
  • Public types have stable names and shapes for downstream .NET consumers.
  • Domain failures are modeled with option or Result, not undocumented null.
  • Pipelines remain readable and do not hide repeated enumeration of expensive sequences.
  • Tests cover at least one success and one failure path for each domain constructor or validator.

Validate

Run the narrowest relevant checks after changes:

dotnet build
dotnet test
dotnet fsi scripts/check.fsx

If adding a new F# file, also inspect the project file diff to confirm the compile order is deliberate.

Sources

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Route gh-aw workflow design/create/debug/upgrade requests to the right prompts.

中文简介正在准备中。当前显示原文说明。

managedcode/dotnet-skills4902026年10月17日 更新

Use a repo-root `.editorconfig` to configure free .NET analyzer and style rules. Use when a .NET repo needs rule severity, code-style options, section layout, or analyzer ownership made explicit. USE FOR: the repo needs a root .editorconfig; analyzer severity and style ownership are unclear; the team wants one source of truth for rule configuration. DO NOT USE FOR: choosing analyzers with no config change; formatting-only execution with no config ownership question. INVOKES: inspect the repository context, edit targeted files, and run relevant build, test, lint, or validation commands when changes are made.

中文简介正在准备中。当前显示原文说明。

managedcode/dotnet-skills4902026年10月17日 更新

Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I/O with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.

中文简介正在准备中。当前显示原文说明。

managedcode/dotnet-skills4902026年10月17日 更新

Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java/Kotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.

中文简介正在准备中。当前显示原文说明。

managedcode/dotnet-skills4902026年10月17日 更新

Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift/Objective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.

中文简介正在准备中。当前显示原文说明。

managedcode/dotnet-skills4902026年10月17日 更新

Design or review .NET solution architecture across modular monoliths, clean architecture, vertical slices, microservices, DDD, CQRS, and cloud-native boundaries without over-engineering. USE FOR: .NET architecture choices; layer and domain boundary review; service decomposition; clean architecture, vertical slice, DDD, CQRS, and modular monolith decisions. DO NOT USE FOR: unrelated stacks; generic tasks that do not need this specific guidance. INVOKES: inspect the repository context, edit targeted files, and run relevant build, test, lint, or validation commands when changes are made.

中文简介正在准备中。当前显示原文说明。

managedcode/dotnet-skills4902026年10月17日 更新

查看 managedcode 的全部技能

报告此技能的问题