2016-05-23 36 views

Antwort

9

Das Adjektiv algebraic in algebraic data types bezieht sich nicht auf einen Typ, der verwendet wird, um ein Algebraproblem zu lösen, z.

x + y = 3 or 5 * y = 10 

das Adjektiv algebraic auf die Art und Weise bezieht sich Typen aufgebaut sind/deklariert die algebraic Betreiber der Multiplikation mit (*) und zusätzlich (+). Insbesondere können algebraische Typen product types (*) sein, die Tupel, z.B.

type Variable = string * int 

und sum types, die das oder Zeichen (|) anstelle des Pluszeichens (+), die Vereinigungen diskriminiert werden, z.B.

type Term = 
    | Var of Variable 
    | Const of Constant 
    | App of Constant * Term list 

Sobald man das versteht und verschiebt ihre den Wikipedia-Artikel über algebraic data types denken sollte Sinn machen und dies wird erklären, warum Sie nicht finden, was Sie suchen, zum Beispiel Artikel, die erklären, wie Algebraprobleme mit algebraischen Datentypen gelöst werden können.

Im Wesentlichen neue Typen aufgebaut sind aus primitive data types wie int, char, string usw. und die algebraische Betreiber von product und summation aber noch wichtiger ist, sind algebraische Datentypen basierend auf type theory und formal system mit sich bringen wird alle die Vorteile eines formellen Systems.

Bemerkenswert ist auch der Unterschied in den Operatoren zum Deklarieren des Tupeltyps und der Operatoren, die zum Erzeugen eines Tupelwerts, z.

type Variable = string * int type 
("x",0)       value 

Notiz Der * Operator für den Typ und die , Operator für den Wert.

Auch

type Term =       type 
    | Var of Variable 
    | Const of Constant 
    | App of Constant * Term list 

Var("x",0)       value 
Const("1")       value 
App("add",[Const("1"),Var("x",0)]) value 

Hinweis, dass jeder possible option eine case identifier, wenn sie mit einem Wert verwendet haben muss.

Wenn Sie mehr über ADTs erfahren, werden Sie auf generalized algebraic data type stoßen, aber leider hat F # sie nicht, aber war requested.

Mark Seemann lieferte einen Link zu Power of mathematics - Reasoning about functional types von Tomas Petricek. Tomas hat dann einen toten Link fairly readable introduction aber hier ist es oder etwas ähnliches: What the Heck are Algebraic Data Types? (for Programmers) oder die Serie, die ich von Chris Taylor bevorzugen, die Haskell verwendet, aber die Ideen zu F # übersetzen Sie:

The Algebra of Algebraic Data Types, Part 1
The Algebra of Algebraic Data Types, Part 2
The Algebra of Algebraic Data Types, Part 3

+0

Also im Grunde ist F # nur eine funktionale Programmiersprache ähnlich wie Pyret? –

+1

Dies ist das erste Mal, dass ich von [Pyret] gehört habe (https://www.pyret.org/), aber nach einer kurzen Lektüre des Intro-Absatzes würde ich zustimmen, dass sie beide funktionale Sprachen der [ML-Familie] sind (https://en.wikipedia.org/wiki/ML_(programming_language)), aber ich konnte ADT für Pyret nicht finden, und was ich über das Typsystem für Pyret gelesen habe, würde ich nicht sagen, dass das Übersetzen von einer in die andere würde einfach sein, weil die Typsysteme anders sind. –

+0

Während Sie bereits die Frage gestellt haben und eine Antwort haben, führt mich dieser Kommentar zu der Annahme, dass Sie bei Pyret Hilfe gesucht haben, aber Pyret in die Nähe von F # genommen haben und von dort weggegangen sind. Eine neue Frage zu den Unterschieden zwischen den Typsystemen von Pyret und F # zu stellen wäre interessant, aber ich kenne niemanden, einschließlich mir selbst, der antworten könnte. –