hindley-milner

___ answer39811823 ___

Dies beantwortet Ihre Frage nicht genau, aber ein Ansatz, der manchmal funktioniert, ist, Ihre Interpretation Ihres Typs zu ändern. Zum Beispiel statt

%Vor%

könnten Sie

verwenden %Vor%

Auf diese Weise kann kein ungültiger Bereich dargestellt werden.

    
___ qstnhdr ___ Begrenzen Sie eine Zahl auf einen Bereich (Haskell) ___ answer39812205 ___

Diese Lösung verwendet abhängige Typen (und könnte zu schwergewichtig sein, überprüfen Sie, ob die Antwort von dfeuer für Ihre Bedürfnisse ausreicht).

Die Lösung verwendet das %code% -Modul von base sowie die typelits-Zeugen Paket.

Hier ist eine Differenzfunktion, die zwei ganzzahlige Argumente (statisch bekannt) annimmt und sich bei der Kompilierung beschwert, wenn die erste Zahl größer als die zweite ist:

%Vor%

Wir können es von GHCi überprüfen:

%Vor%

Aber was, wenn wir die Funktion mit zur Laufzeit bestimmten Werten verwenden wollen? Sprich, Werte, die wir aus der Konsole oder aus einer Datei lesen?

%Vor%

In diesem Fall verwenden wir Funktionen wie %code% und %code% . Diese Funktionen können mit %code% fehlschlagen. Gelingt dies jedoch, geben sie einen Wert zurück, der eine Einschränkung "bezeugt". Und durch Mustervergleich auf dem Zeugen bringen wir diese Einschränkung in den Geltungsbereich (dies funktioniert, weil der Zeuge eine GADT ist).

In diesem Beispiel bringt die %code% -Musterübereinstimmung %code% für die beiden Argumente in den Gültigkeitsbereich. Und die %code% Musterübereinstimmung bringt die %code% Einschränkung in den Gültigkeitsbereich. Nur dann können wir unsere Funktion %code% aufrufen.

Also haben wir in gewisser Weise die ganze Arbeit verschoben, um sicherzustellen, dass die Argumente die erforderlichen Voraussetzungen aus der Funktion selbst erfüllen.

    
___ qstntxt ___

Ich stelle eine Funktion zur Verfügung, die zwei Parameter benötigt, eine ist eine Mindestgrenze und die andere ist eine Höchstgrenze. Wie kann ich mit Typen sicherstellen, dass beispielsweise die Mindestgrenze nicht größer ist als die Maximalgrenze?

Ich möchte es vermeiden, einen intelligenten Konstruktor zu erstellen und ein Maybe zurückzugeben, da dies die gesamte Verwendung umständlicher machen würde.

Danke

    
___ answer39811738 ___

Was Sie verlangen, sind abhängige Typen. Es gibt ein nettes Tutorial dazu in Ссылка

Obwohl ich nicht weiß, wie freundlich es sein wird. Beachten Sie, dass die abhängige Typisierung in GHC 8.0 verbessert wurde, aber ich habe keine Erfahrung in diesem Bereich. Ich würde sicherstellen, dass Sie mit der Vorlage Haskell vertraut sind, wenn Sie nicht wollen, dass es umständlich ist.

    
___ tag123haskell ___ Haskell ist eine funktionale Programmiersprache mit starker statischer Typisierung, verzögerungsfreier Auswertung, umfangreicher Parallelitäts- und Parallelitätsunterstützung und einzigartigen Abstraktionsfunktionen. ___ tag123funktionale Programmierung ___ Funktionale Programmierung ist ein Programmierparadigma, das auf der Erzeugung von Abstraktionen unter Verwendung von Funktionen basiert, die Nebeneffekte und Zustandsänderungen vermeidet. Reine funktionale Programmierung ist threadsicher. ___ tag123types ___ Typen und Typsysteme werden verwendet, um Abstraktionsstufen in Programmen zu erzwingen. ___ answer39814492 ___

Sie müssen den %code% -Typ nicht aufrufen, um "intelligente Konstruktoren" zu nutzen. Wenn Sie möchten, können Sie Konstruktoren der Form %code% oder %code% akzeptieren und trotzdem einen %code% type erzeugen, der richtig interpretiert, welcher welcher ist.

Zum Beispiel könnten Sie ein kleines Modul machen:

%Vor%

Und jetzt, wenn Sie ein %code% mit %code% erstellen, wird das 2-Tupel automatisch so arrangiert, dass es in der Form %code% ist. Beachten Sie, dass der Konstruktor für %code% nicht exportiert wird. Daher kann der Benutzer des Moduls keine ungültige %code% erstellen. Sie müssen lediglich sicherstellen, dass Sie gültige Module in diesem Modul erstellen.

    
___ tag123hindleymiller ___ In der Typentheorie ist Hindley-Milner (HM) eine klassische Inferenzmethode mit parametrischem Polymorphismus für den Lambda-Kalkül. ___ tag123typetheory ___ Die Typentheorie ist in Programmiersprachen eng verwandt mit (und in einigen Fällen überlappt mit) Typsystemen. In der Typentheorie hat jeder "Term" einen "Typ" und Operationen sind auf Terme eines bestimmten Typs beschränkt. ___
1
Antwort

Warum sind typsichere relationale Operationen so schwierig?

Ich habe versucht, ein relationales Problem in Haskell zu kodieren, als ich herausfinden musste, dass dies auf eine Art und Weise sicher ist, ist alles andere als offensichtlich. Z.B. eine bescheidene %Vor% wirft bereits eine Reihe von Frage...
02.05.2015, 08:35
1
Antwort

runST mit Hindley-Milner-System

Wenn ich die ST-Monade in Haskell richtig verstehe, verwendet runST geschickt Rank-2-Typen, um sicherzustellen, dass eine Berechnung keinen anderen Thread referenziert, wenn sie der Monade entkommt. Ich habe eine Spielzeugsprache mit einem...
27.09.2016, 12:43
2
Antworten

Können wir Variablenvariablen in der Konstruktorposition im Hindley-Milner-Typensystem haben?

In Haskell können wir den folgenden Datentyp schreiben: %Vor% Die Typvariable f hat die Art * -> * (d. h. es ist ein Konstruktor des unbekannten Typs). Daher hat Fix die Art (* -> *) -> * . Ich frage mich, ob Fix ein g...
06.05.2016, 04:38
0
Antworten

Darstellung von Polymorphismus mit Unification-fd

Ich möchte das Paket unification-fd verwenden, um einen einfachen Typchecker für einen Hindley-Milner zu implementieren Typ System. Dies erfordert die Darstellung von polymorphen ("forall") Typen. Wie können diese Typen am besten dargest...
30.04.2016, 05:01
4
Antworten

Begrenzen Sie eine Zahl auf einen Bereich (Haskell)

Ich stelle eine Funktion zur Verfügung, die zwei Parameter benötigt, eine ist eine Mindestgrenze und die andere ist eine Höchstgrenze. Wie kann ich mit Typen sicherstellen, dass beispielsweise die Mindestgrenze nicht größer ist als die Maximalgr...
01.10.2016, 18:44