Consider adding a phantom type to Kleisli
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
- Tipo di issue
- Funzionalità
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- fsharp
- Ambito
- developer-experience
Direzione di ricerca
Non viene indicato alcun file né test. Inizia individuando la definizione di Kleisli e il relativo operatore di composizione di categorie, quindi riproduci l’esempio mostrato della restrizione dei valori. Il lavoro è completato quando è stata presa una decisione sull’approccio basato sul tipo fantasma e, se viene accettato, è stato verificato che la composizione con binding let funziona senza introdurre le restrizioni dei valori indicate.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
We could get better types, but we risk more value restrictions.
For instance, defining it like this:
/// Kleisli arrows of a monad. Represents a function 'T -> 'Monad<'U>
[<Struct; NoEquality; NoComparison>]
type Kleisli<'t, '``monad<'u>``,'u> = Kleisli of ('t -> '``monad<'u>``) with
// Profunctor
static member inline Dimap (Kleisli bmc: Kleisli<'B,'``Monad<'C>``,'C>, ab: 'A->'B, cd: 'C->'D) = let cmd = map cd in Kleisli (ab >> bmc >> cmd) : Kleisli<'A,'``Monad<'D>``,'D>
static member Contramap (Kleisli f : Kleisli<'B,'``Monad<'C>``,'C>, k: 'A->'B) = Kleisli (k >> f) : Kleisli<'A,'``Monad<'C>``,'C>
static member inline Map (Kleisli f : Kleisli<'B,'``Monad<'C>``,'C>, cd: 'C->'D ) = Kleisli (map cd << f) : Kleisli<'B,'``Monad<'D>``,'D>
// Category
static member inline get_Id () = Kleisli result : Kleisli<'a,'b,'a>
static member inline (<<<) (Kleisli (f: 'U->'``Monad<'V>``): Kleisli<'U,'``Monad<'V>``,'V>, Kleisli (g: 'T->'``Monad<'U>``): Kleisli<'T,'``Monad<'U>``,'U>) =
Kleisli ( (g >=> f) : 'T->'``Monad<'V>``) : Kleisli<'T, '``Monad<'V>``, 'V>
Allows us to run:
let r5: List<_> = (runKleisli (getCatId ())) 5
let k = Kleisli (fun y -> [y; y * 2 ; y * 3]) <<< Kleisli (fun x -> [x + 3; x * 2])
let r8n16n24n10n20n30 = runKleisli k 5
But we get a value restriction
error FS0030: Value restriction. The value 'k' has been inferred to have generic type
[<Struct>]
val k : Kleisli<int,int list,'_a>
Either define 'k' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.
that we can avoid, by not let-binding k
let r5: List<_> = (runKleisli (getCatId ())) 5
let r8n16n24n10n20n30 = runKleisli (Kleisli (fun y -> [y; y * 2 ; y * 3]) <<< Kleisli (fun x -> [x + 3; x * 2])) 5
or by adding another constraint:
static member inline (<<<) (Kleisli (f: 'U->'``Monad<'V>``): Kleisli<'U,'``Monad<'V>``,'V>, Kleisli (g: 'T->'``Monad<'U>``): Kleisli<'T,'``Monad<'U>``,'U>) =
let _ = if true then Unchecked.defaultof<'``Monad<'V>``> else result (Unchecked.defaultof<'V>)
Kleisli ( (g >=> f) : 'T->'``Monad<'V>``) : Kleisli<'T, '``Monad<'V>``, 'V>
- Lingua principale
- F#
- Stelle
- 941
- Fork
- 106
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di fsprojects/FSharpPlus
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
fsprojects/FSharpPlus#683 · 1 commento · 2 reazioni ·
-
bug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
fsprojects/FSharpPlus#678 ·
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
fsprojects/FSharpPlus#644 ·
-
breaking change F#+ v2.0
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
fsprojects/FSharpPlus#643 ·
-
lens type signature Apertabreaking change F#+ v2.0
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
fsprojects/FSharpPlus#641 ·
Tutte le issue di fsprojects/FSharpPlus
Issue simili
-
kaliscan.com ApertaN: AdGuard for iOS P3: Medium T: Ads
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
AdguardTeam/AdguardFilters#242501 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
-
[BUG] createTool tools cannot be registered with Mastra when exactOptionalPropertyTypes is enabled Apertacustomer-eng status: needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
-
add-toolnames MCP Toolnames Toolnames checkup
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
rajbos/ai-engineering-fluency#2190 · 3 commenti ·
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
gajus/eslint-plugin-jsdoc#1776 · 1 reazione ·