F # Typeinschränkung - Die Typvariable 'a wurde auf den Typ' 'b' beschränkt.

Herr Baudin

Ich versuche, eine Funktion zum Laufen zu bringen, die einen Umschlagtyp auspackt, eine Funktion auf den Inhalt anwendet und einen Umschlagtyp zurückgibt. So ähnlich wie die Bindefunktion eines Burritos.

type Envelope<'a> =
  { Content : 'a
  ; Errors : string list
  }

let (!>) f e =
    let {Content=content:'a; Errors=errors} = e

    match errors with
    | [] -> e : Envelope<'a>
    | _ -> f content : Envelope<'b>

Der Fehler ist:

This construct causes code to be less generic than indicated by the type annotations. The type variable 'a has been constrained to be type ''b'.

Ich habe das "Gefühl", warum es falsch ist, manchmal kehre ich zurück Envelope<'a>und manchmal kehre ich zurück Envelope<'b>.

Wie kann ich das zum Laufen bringen? Ich versuche, es so zu machen, als würde ich eine Bindungsfunktion für beispielsweise einen Optionstyp ausführen:

let (>>=) f o =
  match o with
  | Some v -> f v
  | None -> None 
Gus

Das Problem ist, dass beide Fälle der Übereinstimmung denselben Typ zurückgeben sollten, da dies sonst im Typsystem keinen Sinn ergibt.

Sie müssen einen neuen Umschlag erstellen, aber ich stelle mir vor, dass das Problem darin besteht, dass Sie f nicht berechnen möchten, wenn Fehler vorliegen. Eine hackige Methode hierfür wäre also:

type Envelope<'a> =
  { Content : 'a
  ; Errors : string list
  }

let (!>) f e =
    let {Content=content:'a; Errors=errors} = e

    match errors with
    | [] -> {Content = Unchecked.defaultof<_>; Errors = e.Errors }  : Envelope<'b>
    | _ -> f content : Envelope<'b>

Aber das ist nicht was Sie wollen, da Sie den Inhalt verlieren werden.

Der richtige Weg wäre, eine diskriminierte Union anstelle eines Datensatzes zu verwenden, aber ich denke, Sie möchten die Kompensationsfunktion immer dann anwenden, wenn Fehler auftreten. In diesem Fall kann Ihre Kompensationsfunktion daher nicht polymorph sein die ursprüngliche Fehlermeldung.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

F #, Deedle: Generischer Frame, der auf den Typ Frame <obj, obj> beschränkt ist

Typescript beschränkt den generischen Typ auf den String-Literal-Typ zur Verwendung in der Eigenschaft für berechnete Objekte

Typoskript-Mixin beschränkt auf den Typ der Klasse

AWS EKS fügt Benutzer hinzu, die auf den Namespace beschränkt sind

Django beschränkt den Zugriff auf die Ansicht für bestimmte Objekte

F # -Typeinschränkung mit Enum-Typ

Entfernen der Typeinschränkung für einen Typ auf einen Wert, der die Einschränkungen erfüllt. Dh Num a => a bis nur Int

Beschränkt die Beschränkung einer App im Google Play Store auf bestimmte Länder auch den öffentlichen Beta-Zugriff?

Wie füge ich UIImageViews zu einer UIStackView hinzu, die auf den centerXAnchor einer Ansicht beschränkt ist?

Der Typ 'Fehler' ist auf den Nichtprotokolltyp beschränkt, auch wenn der Typ ein Protokoll ist

Die zu vereinheitlichende Typvariable tritt im Typ auf

Typoskript beschränkt den Typ ohne Eigenschaften auf das Akzeptieren von Zeichenfolgen oder Arrays

JOOQ-Feldklasse, die nur auf Datensatz beschränkt ist (ohne Typ)

Die Schnittstelle beschränkt den Schlüsselwert auf den exakten Wert eines const-Typoskripts

Die Symfony-Sicherheit beschränkt den Zugriff auf eine Routenliste auf bestimmte IP-Adressen

Django beschränkt den Zugriff auf Benutzerobjekte

Gibt es eine Einschränkung, die meine generische Methode auf numerische Typen beschränkt?

Google beschränkt die API für die automatische Vervollständigung von Javascript auf Vorschläge

Plotband nicht auf xAxis beschränkt, zeichnet für den gesamten Graphen

git: Beschränkt den Zugriff auf einen bestimmten Ordner für einige Benutzer in bitbucket

Django Rest Framework beschränkt die Ansicht von Benutzerdaten auf Administratoren und den eigenen Benutzer

WebStorm beschränkt den Refactor-Bereich nur auf die aktuelle Datei

Konvertieren Sie von jährlichen in vierteljährliche Daten, die auf den Jahresdurchschnitt beschränkt sind

Was bedeutet es, dass die Verwendung der Groovy-Kategorie auf den aktuellen Thread beschränkt ist?

Der Django-Administrator beschränkt den Zugriff auf die Listenansicht

Die Überladungsmethode der visuellen Komponente beschränkt den Zugriff auf private Mitglieder

Die Laravel-Middleware beschränkt den Zugriff auf unerwünschte Funktionen

JQuery entfernt Duplikate, die auf den äußeren Container beschränkt sind

Materialkomponente Web - Registerkarten mit Symbolen über Beschriftungen und Anzeigen, die auf den Inhalt beschränkt sind

TOP Liste

  1. 1

    So verschieben Sie ein Bild in Flutter/Dart mit einem Draggable

  2. 2

    Unity Build-Fehler: Der Name 'EditorUtility' ist im aktuellen Kontext nicht vorhanden

  3. 3

    TypeAhead.js zeigt keine Ausgangsschienen an?

  4. 4

    Deklarieren einer nicht initialisierten Variablen in der Klassendefinition in Python

  5. 5

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  6. 6

    spring-data-jpa: ORA-01795: Die maximale Anzahl von Ausdrücken in einer Liste beträgt 1000

  7. 7

    Warum funktioniert Phantomjs nicht mit dieser Site?

  8. 8

    Interpolieren Sie mit Python die 2D-Matrix entlang der Spalten

  9. 9

    numpy: Berechnen Sie die Ableitung der Softmax-Funktion

  10. 10

    Wie vermeide ich, dass die gesamte App neu geladen wird, wenn Nav.Link von React-Bootstrap verwendet wird?

  11. 11

    MongoDB eingebettetes Dokument unterscheiden und filtern

  12. 12

    Aktualisieren des Werts im Json-Objekt in Python

  13. 13

    Warum funktioniert das Umgebungslicht in diesem Beispiel nicht?

  14. 14

    Python gibt einen Fehler aus, dass eine Datei nicht vorhanden ist, wenn dies eindeutig der Fall ist

  15. 15

    Wie verwende ich Format-Table ohne Abschneiden von Werten?

  16. 16

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  17. 17

    Überprüfen Sie, ob der ausgewählte Wert 'YES' ist, wenn ja, aktivieren Sie ein Steuerelement mit Javascript

  18. 18

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  19. 19

    Holen Sie sich verwandte Pillen Inhalt mit angeklickten img in Angular

  20. 20

    Eclipse Oxygen - Projekte verschwinden

  21. 21

    Wie aktualisiere ich ein Feld in einer Raumdatenbank mit einem Repository und einem Ansichtsmodell?

heißlabel

Archiv