# Frege (llenguatge de programació)

Frege és un llenguatge de programació funcional, pur, d'avaluació tardana, de la família del llenguatge Haskell i influenciat pel Java. Té un sistema de tipatge fort amb tipus estàtics i inferència de tipus.
Frege és creat per a l'ecosistema de la Màquina Virtual Java proporcionant facilitat d'interacció amb classes generades des d'altres llenguatges a la mateixa màquina virtual.
Frege és atribuïble a Ingo Wechsung (Language reference doc.). Butlletí històric.
Frege no és un dialecte de Haskell encara que hi té moltes concordances. Ve a ésser un assaig reeixit de Haskell, però més acadèmic que normatiu (per ex. la classe Mònada no incorpora el mètode fail, que s'inclou en una classe derivada MonadFail), incorporant al llenguatge trets amb paral·lelismes al model de la màquina virtual Java subjacent.
El nom del llenguatge de programació pretén honorar Gottlob Frege (un dels inventors de la currificació).

## Compilant programes Frege

Frege requereix un Java Development Kit (JDK) de la versió Java-7.
Com s'esmenta a la pàgina "Getting started"
Aquí assumim que el compilador descarregat com a frege3.xx.vvv.jar ha estat reanomenat a fregec.jar.
Per executar el programa, cal esmentar-ne el nom de la classe d'arrencada.
Sobre Microsoft Windows el separador de la classpath cal que sigui ';' en comptes de ':'

## Diferències amb Haskell

Un resum de les diferències amb Haskell està llistat a la pàgina Differences between Frege and Haskell.
El tipus String està definit com una interfície amb les cadenes Java. L'op. (++) està lligat al (+) de les cadenes Java. Però l'String de Frege implementa una classe ListLike que defineix els mètodes essencials de les llistes (Vegeu el mòdul PreludeList). Funcions de conversió al tipus corresponent al Haskell [Char]:
Literals:
Els literals numèrics no es poden emprar com al Haskell associats a una classe de tipus (sobrecàrrega d'operacions), sinó, com al Java, associats a un tipus.
La classe Monad del Frege no inclou el mètode fail, que s'inclou en una classe separada MonadFail.
Frege no implementa les excepcions del Haskell. Les excepcions de les crides a Java són caçades per la interfície de crides al llenguatge nadiu que han d'incorporar el resultat en un tipus (Either JException tipusDelResultat).
Les classes numèriques per a coma flotant no es corresponen amb les de Haskell.

## Exemples més elaborats
### El tipus de dada Registre admet mètodes, per casar amb les classes de la JavaVM

Els accessors per als camps fan servir la notació del punt (navegació de dades) i no comporten una funció a nivell de mòdul com fa el Haskell. (L'equivalent s'obté qualificant amb el Tipus: Tipus.nomDeCamp).

### IORefs / Exportació d'identificadors

* El tipus IORef té mètodes com el Java {.new iniVal, .get, .put val}.
* Identificadors exportats: L'exportació o no d'un símbol per part d'un mòdul no va com al Haskell sino mitjançant qualificadors d'accés private / protected / public (per omissió). Els etiquetats protected només s'exporten si el mòdul que els importa els menciona explícitament en una llista d'importació.
* la definició d'operadors requereix cometes revesses. El rang de precedència (1..16) és diferent del del Haskell (0..9).
* les crides a funcions sense paràmetres amb efectes col·laterals han de dur el paràmetre (Unit) per evitar la memoïtzació.

### Interfície amb Java

Cal afegir el qualificatiu native. Vegeu capítol "Native Interface" al Manual.
* Els mètodes purs (quin resultat només depèn dels paràmetres) han de dur el qualif. pure.
* Les definicions de tipus per a la interfície de classes Java amb estat han de dur un paràmetre fantasma (els que no figuren en la definició) per a l'estat corresponent al paràmetre de la Mònada (com ara (IO s)).
* Els paràmetres amb valors que admeten null cal embolcallar-los en un tipus Maybe.
* Els resultats de crides a Java que generen excepcions, cal embolcallar-los en un tipus Exception com ara Exception resultType sinònim de (Either JException resultType).
executant:

## Relacionat

* Haskell
* Java

## Referències

* ↑ Downloads Language reference.
* ↑ What is frege (or what will it be)? Butlletí històric.
* ↑ Frege project - Getting started
* ↑ «PreludeBase.fr». Arxivat de l'original el 2014-08-22. [Consulta: 21 maig 2012].
* ↑ «Monadic related functionality». Arxivat de l'original el 2015-05-12. [Consulta: 21 maig 2012].

## Enllaços externs

* Frege Programming Language Blog
* Hello World Frege!

### A fons

* Referència del llenguatge (descàrregues)
* Exemples del Frege Arxivat 2015-05-12 a Wayback Machine.