Antología Programacion Logica y Funcional
Short Description
Antologia...
Description
Instituto tecnológico superior de zongolica
ANTOLOGÍA DE PROGRAMACIN LGICA ! "#NCIONAL
M$%$C$ Mart&n Contreras de la Cruz
%EME%TRE AGO'()* + ENE'(),
PROPÓSITO DEL CURSO La asignatura de Programación Lógica y Funcional aporta al perfil del Ingeniero en Siste Sistemas mas Compu Computa tacio ciona nales les la capa capaci cidad dad de desa desarro rrolla llarr habili habilidad dades es para para la generac generación ión de solucion soluciones es automat automatizad izadas as basadas basadas en lenguaje lenguajes s de intelige inteligencia ncia arti artifi fici cial al,, cons consid ider eran ando do el ento entorn rno o y la apli aplica caci ción ón de dive divers rsas as tcn tcnic icas as,, herramientas y conocimientos!
Los program programas as para computad computadora ora actualme actualmente nte son fundame fundamental ntales es en muchas muchas "reas del ser humano, debido a #ue se usan para resolver diversos problemas en la ciencia, la industria y los negocios! Para cubrir estas necesidades, se han desarro desarrollad llado o lengua lenguajes jes de program programaci ación ón dentro dentro de la intelige inteligencia ncia artificia artificial! l! $l Inge Ingen niero iero
en
Sist Sistem emas as
Comp Comput utac acio ion nales ales
cont contri ribu buir ir", ",
apli aplica can ndo
esto estos s
conocimientos conocimientos para la solución de problemas a travs de la programación lógica y funcional, con una conciencia tica y de respeto al medio ambiente!
Prog Progra rama maci ción ón Lógi Lógica ca y Func Funcio iona nal, l, es una una asig asigna natu tura ra #ue #ue re#u re#uie iere re tene tener r conocim conocimien ientos tos esencia esenciales les acerca acerca de los lenguaj lenguajes es lógicos lógicos y funciona funcionales les de la intelige inteligencia ncia artific artificial, ial, incluy incluyendo endo la metodol metodolog%a og%a y los aspecto aspectos s relativo relativos s a la codificación, codificación, con el fin de ampliar el conocimiento de tecnolog%as alternativas alternativas para el desa desarr rrol ollo lo de sist sistem emas as auto automa mati tiza zado dos s y la impl implem emen enta taci ción ón de agen agente tes s inteligentes!
CONTENIDO &'I()( *! Conceptos !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 6 Conceptos Fundamentales!!!!!!!!!!!!!!!!!
1.1. Estilos de proramaci!n.............................................................................. proramaci!n.............................................................................. " 1.#. E$aluaci!n de e%presiones......... e%presiones.................. .................. .................. ............................................ ................................... 1# 1.&. De'inici!n de 'unciones............................................................................. 'unciones............................................................................. 1( 1.). Disciplina de tipos...................................................................................... tipos...................................................................................... 1* 1.(. Tipos de datos............................................................................................. datos............................................................................................. 1" &'I()( +! Proramaci!n Funcional!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 22 #.1. El tipo de datos........................................................................................... datos ........................................................................................... #) #.#. Funciones.................................................................................................... Funciones.................................................................................................... &) #.&. Inter$alos..................................................................................................... Inter$alos..................................................................................................... &( #.). Operadores.................................................................................................. Operadores.................................................................................................. &+ #.(. ,plicaciones de las listas......... listas.................. .................. ................. ................. ....................................... .............................. &* #.+. -roles......................................................................................................... -roles......................................................................................................... )/ &'I()( . E$aluaci!n pere0osa!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 42 &.1. Estrateias de e$aluaci!n pere0osa......................................................... pere0osa......................................................... )) &.#. Tcnicas de proramaci!n 'uncional pere0osa...................................... pere0osa...................................... )* &'I()( -! Fundamentos de la proramaci!n l!ica!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 50 ).1. Repaso de l!ica de primer orden............................................................ orden............................................................ (# ).#. Uni'icaci!n 2 Resoluci!n........................................................................... Resoluci!n........................................................................... (( ).&. Cl3usulas de 4orn. Resoluci!n SLD......... SLD .................. ................. ...................................... .............................. (+ ).). Proramaci!n l!ica con cl3usulas de 4orn 4orn.......................................... .......................................... +# ).(. Consulta de una ase de cl3usulas.......................................................... cl3usulas.......................................................... +& ).+. Representaci!n causada del conocimiento............................................ conocimiento............................................ +& ).*. Consulta de una ase de cl3usulas.......................................................... cl3usulas.......................................................... */ ).". Espacios de 5s6ueda............................................................................... 5s6ueda............................................................................... */ ).7. Proramaci!n l!ica con n5meros8 listas 2 3roles.............................. 3roles. ............................. *) 9I9LIO:R,FI,...................................................................................................... 9I9LIO:R,FI, ...................................................................................................... 91
RED CONCEPTU,L DEL CURSO
Conceptos Fundamentales Programación Funcional Programación Lógica y Funcional Evaluación Perezosa Fundamentos de Programación Lógica
CO;PETENCI,S , ,LC,N>>>.. ?om+re de la funci(n
* >>>>. $s el argumento -tam+ién conocido como parámetro formal
/efinici(n de funciones: Una definici(n de funci(n se presenta de la siguiente manera: unci,n nombre-funcion("1% "2% .% "n) /nicio loue de instrucciones in
/onde: unci,n >>>>> $s la pala+ra cla%e que nos indica una definici(n de funci(n. ombre-funcion >> $s el identificador con el cual se reconoce a la funci(n en
el cuerpo del algoritmo principal.
"1%"2%.%"n >>> $s el grupo de parámetros que define a la funci(n.
Llamado a una func!n Cuando definimos una funci(n solo le indicamos al algoritmo que esta funci(n existe, pero una definici(n de funci(n no implica la reali0aci(n de las instrucciones que la constituyen. *ara )acer uso de una funci(n, el algoritmo principal la de+e llamar. *or ejemplo: unci,n (*) /nicio * +(1 $ *32) in /nicio /m"rimir ste es el algoritmo "rinci"al 7eer 8 () llamado de la funci,n /m"rimir l resultado de la funci,n es%8 in
1.). Disciplina de tipos. Los tipos se infieren, es decir se comprue+an, de forma estática, en tiempo de compilaci(n.< $n los lenguajes de programaci(n con disciplina de tipos, cada tipo representa una colecci(n de %alores o datos similares. $l conocer los tipos de las funciones ayuda a documentar los programas y e%itar errores en tiempo de ejecuci(n. Un lenguaje tiene disciplina de tipos si los errores de tipos se detectan siempre ⇒ es necesario determinar los tipos de todos los operandos, ya sea en tiempo de compilaci(n o de ejecuci(n •
@
•
@
*ascal Cercano a tener disciplina de tipos pero no reali0a compro+aci(n de tipos en los registros %ariantes -incluso puede omitirse la etiqueta discriminatoria en dic)os registros 5da 'esuel%e el pro+lema de los registros %ariantes reali0ando compro+aci(n dinámica de tipos -s(lo en este caso
@ "iene una funci(n de +i+lioteca que permite extraer un %alor de una %aria+le de cualquier tipo -como una cadena de +its y usarlo como un tipo diferente -no es una con%ersi(n de tipos ⇒ se trata de una suspensi(n temporal de la compro+aci(n de tipos
•
C
@ ?o tiene disciplina de tipos por: A ?o se reali0a compro+aci(n de tipos so+re las uniones A *ermite funciones con parámetros so+re los que no se reali0a compro+aci(n de tipos •
8a%a
@ "iene disciplina de tipos -no )ay uniones •
;L y asell
@ *oseen disciplina de tipos
@ Los tipos de los parámetros de las funciones -y de estas mismas se conocen en tiempo de compilaci(n -ya sea por declaraci(n del usuario o por inferencia de tipos asell y otros lenguajes funcionales utili0an el sistema de tipos de ;ilner, que tiene dos caracter7sticas fundamentales: •
•
/isciplina estática de tipos: Los programas +ien tipados se pueden conocer en tiempo de compilaci(n. Un programa +ien tipado se puede utili0ar sin efectuar compro+aciones de tipo en tiempo de ejecuci(n, estando garanti0ado que no se producirán errores de tipo durante el computo. *olimorfismo: *ermite que una misma funci(n se pueda aplicar a parámetros de diferentes tipos, dependiendo del contexto en el que la funci(n se utilice.
1.(. Tipos de datos "odos los datos tienen un tipo asociado con ellos. Un dato puede ser un simple carácter, tal como +D, un %alor entero tal como #E. $l tipo de dato determina la naturale0a del conjunto de %alores que puede tomar una %aria+le. • • • • •
?uméricos Simples L(gicos 5lfanuméricos -string "ipos de datos 5rreglos -Fectores, ;atrices $structurados 'egistros -/ef. por el 5rc)i%os usuario 5puntadores
"ipos de /atos Simples •
•
•
/atos ?uméricos: *ermiten representar %alores escalares de forma numérica, esto incluye a los n&meros enteros y los reales. $ste tipo de datos permiten reali0ar operaciones aritméticas comunes. /atos L(gicos: Son aquellos que solo pueden tener dos %alores -cierto o falso ya que representan el resultado de una comparaci(n entre otros datos -numéricos o alfanuméricos. /atos 5lfanuméricos -String: $s una secuencia de caracteres alfanuméricos que permiten representar %alores identifica+les de forma descripti%a, esto incluye nom+res de personas, direcciones, etc. $s posi+le representar n&meros como alfanuméricos, pero estos pierden su propiedad matemática, es decir no es posi+le
)acer operaciones con ellos. $ste tipo de datos se representan encerrados entre comillas
$n asell nos encontramos con diferentes tipos simples como: • • • •
Gnt Gnteger C)ar Bool
L(gicamente podemos construir listas, tuplas y funciones con esos tipos de datos. !tro tipo que tenemos presente en asell es el tipo polim(rfico. 5s7 podemos construir estructuras y funciones polim(rficas. /entro de las caracter7sticas de los tipos de asell podemos deducir que cada expresi(n tiene un &nico tipo principal y que ese tipo principal se puede deducir automáticamente. 5demás, asell incorpora las funciones so+recargadas que se pueden aplicar so+re %arios tipos pero no so+re todos los tipos. *ara ello se dispone de una jerarqu7a de clases de tipos con operadores y funciones so+recargadas como: • • •
?um: "ipos numéricos. $q: "ipos que se pueden comparar. !rd: "ipos que se pueden ordenar.
$n la siguiente figura podemos encontrar un diagrama so+re la jerarqu7a de clases:
RESU;EN $l manejo de est"ndares y recomendaciones de programación facilitaran al programador la documentación y seguimiento de sus proyectos a6n con el paso del tiempo! 0ejorar" el mantenimiento del soft;are y permitir" #ue el código pueda ser le%do por cual#uier persona de la empresa #ue conozca los est"ndares de codificación! $s necesario indicar #ue las recomendaciones son e:actamente mejores
apreciaciones de la e:periencia de trabajo #ue pueden tomarse y adaptarse a las necesidades de los nuevos paradigmas de la programación!
&'I()( +!
Proramaci!n Funcional
RED CONCEPTU,L
El tipo de datos Funciones ntervalos Programación Funcional !peradores "plicaciones de las listas #r$oles
Competencia :eneral de la Unidad=
−
− − −
Conocer los principales puntos fuertes y debilidades del paradigma de programación funcional Identificar los elementos de la programación funcional. Aplicar la programación funcional en la resolución de problemas reales. Diseñar herramientas alternativas y complementarias de programación.
,cti$idades de ,prendi0a@e • • • •
•
Identificar los conceptos b"sicos de la programación funcional! (escribir las caracter%sticas de la programación funcional! 8econocer la estructura y elementos de la programación funcional! Investigar9 al menos, un lenguaje de programación representativa diferente al establecido para la materia! 8ealizar mapa conceptual de los lenguajes de la programación funcional vistos en la materia!
#.1. El tipo de datos 9alores% :i"os% otras olosinas
*uesto que asell es un lenguaje funcional puro, todos los c(mputos %ienen descritos a tra%és de la e%aluaci(n de expresiones -términos sintácticos para producir valores -entidades a+stractas que son %istas como respuestas. "odo %alor tiene asociado un tipo. -Gntuiti%amente, podemos pensar que los tipos son conjuntos de %alores. $jemplos de expresiones son los %alores at(micos tales como el entero 5, o el carácter =a=, o la funci(n >? @A ?$1 , y los %alores estructurados como la lista B1%2%CD y el par (=b=%4) . Ha que las expresiones denotan %alores, las expresiones de tipo son términos sintácticos que denotan tipos. $jemplos de expresiones de tipo son los tipos at(micos /nteger -enteros con precisi(n ilimitada, Ehar -caracteres, /nteger@A/nteger -funciones que aplican /nteger so+re /nteger, as7 como los tipos estructurados B/ntegerD -lista )omogénea de enteros y (Ehar%/nteger) -par formado por un carácter y un entero. "odos los %alores de asell son de primera categor7a -IfirstJclassI JJJpueden ser argumentos o resultados de funciones, o pueden ser u+icados en estructuras de datos, etc. *or otro lado, los tipos de asell no son de primera categor7a. $n cierto sentido, los tipos descri+en %alores, y la asociaci(n de un %alor con su tipo se llama un tipificado - typing . Usando los ejemplos anteriores, podemos escri+ir ItipificacionesI como los siguientes: 5 /nteger =a= Ehar inc /nteger @A /nteger B1%2%CD B/ntegerD (=b=%4) (Ehar%/nteger)
$l s7m+olo II puede leerse Itiene el tipoI. $n asell las funciones se definen usualmente a tra%és de una colecci(n de ecuaciones. *or ejemplo, la funci(n inc puede definirse por una &nica ecuaci(n: inc n
n$1
Una ecuaci(n es un ejemplo de declaración. !tra forma de declaraci(n es la declaraci(n de tipo de una funci(n o type signature declaration -K..2, con la cual podemos dar de forma expl7cita el tipo de una funci(n6 por ejemplo, el tipo de la funci(n inc: inc
/nteger @A /nteger
Feremos más detalles so+re definiciones de funciones en la Secci(n #. *or ra0ones pedag(gicas, cuando queramos indicar que una expresi(n e2 se e%al&a, o IreduceI a otra expresi(n o %alor e, escri+iremos:
e2 MN e *or ejemplo: inc (inc C)
MN 5
$l sistema de tipificaci(n estático de asell define formalmente la relaci(n entre tipos y %alores -K.2.. $sta tipificaci(n estática asegura que un programa asell está +ien tipificado -type safe6 es decir, que el programador no puede e%aluar expresiones con tipos err(neos. *or ejemplo, no podemos sumar dos caracteres, ya que la expresi(n =a=$=b= está mal tipificada. La %entaja principal del tipificaci(n estática es +ien conocida: todos los errores de tipificado son detectados durante la compilaci(n. ?o todos los errores son de+idos al sistema de tipos6 una expresi(n tal como 1+0 es tipifica+le pero su e%aluaci(n pro%oca un error en tiempo de ejecuci(n. ?o o+stante, el sistema de tipos puede encontrar errores durante la compilaci(n, lo que proporciona al programador una ayuda para ra0onar so+re los programas, y tam+ién permite al compilador generar un c(digo más eficiente -por ejemplo, no se requiere ninguna informaci(n de tipo o prue+as durante la ejecuci(n. $l sistema de tipos tam+ién asegura que los tipos que el usuario proporciona para las funciones son correctos. /e )ec)o, el sistema de tipos de asell es lo suficientemente potente como para descri+ir cualquier tipo de funci(n -con algunas excepciones que %eremos más tarde en cuyos caso diremos que el sistema de tipos infiere tipos correctos. ?o o+stante, son aconseja+les las oportunas declaraciones de tipos para las funciones, como la proporcionada para la funci(n inc, ya que el tipificado de funciones es una forma eficiente de documentar y ayudar al programador a detectar errores. O$l lector )a+rá notado que los identificadores que comien0an con may&scula denotan tipos espec7ficos, tales como /nteger y Ehar, pero no los identificadores que denotan %alores, como inc. $sto no es un con%enio: es o+ligatorio de+ido a la sintaxis de asell. 5demás, todos los caracteres, may&sculas y min&sculas, son significati%os: foo, fFo, y fFF son identificadores distintos.P
2G1G
:i"os Holim,rficos
asell proporciona tipos polimóficos JJJtipos que son cuantificados uni%ersalmente so+re todos los tipos. "ales tipos descri+en esencialmente familias de tipos. *or ejemplo, -paraQtodo aBaD es la familia de las listas de tipo +ase a, para cualquier tipo a. Las listas de enteros -e.g. B1%2%CD, de caracteres -B=a=%=b=%=c=D , e incluso las listas de listas de interos, etc., son miem+ros de esta familia. -?(tese que B2%=b=D no es un ejemplo %álido, puesto que no existe un tipo que contenga tanto a 2 como a =b=. OLos identificadores tales como el anterior a se llaman variables de tipo, y se escri+en en min&scula para distinguirlas de tipos espec7ficos, como /nteger. 5demás, ya que asell
solo permite el cuantificador uni%ersal, no es necesario escri+ir el s7m+olo correspondiente a la cuantificaci(n uni%ersal, y simplemente escri+imos BaD como en el ejemplo anterior. $n otras pala+ras, todas las %aria+les de tipos son cuantificadas uni%ersalmente de forma impl7cita.P Las listas constituyen una estructura de datos comunmente utili0ada en lenguajes funcionales, y constituyen una +uena )erramienta para mostrar los principios del polimorfismo. $n asell, la lista B1%2%CD es realmente una a+re%iatura de la lista 1(2 (CBD)) , donde BD denota la lista %ac7a y es el operador infijo que a9ade su primer argumento en la ca+e0a del segundo argumento -una lista. - y BD son, respecti%amente, los operadores cons y nil del lenguaje Lisp Ha que es asociati%o a la derec)a, tam+ién podemos escri+ir simplemente 12CBD . Como ejemplo de funci(n definida por el usuario y que opera so+re listas, consideremos el pro+lema de contar el n&mero de elementos de una lista: length length BD length (??s)
BaD @A /nteger 0 1 $ length ?s
$sta definici(n es autoJexplicati%a. *odemos leer las ecuaciones como sigue: ILa longitud de la lista %ac7a es R, y la longitud de una lista cuyo primer elemento es ? y su resto es ?s %iene dada por 2 más la longitud de ?s.I -?(tese el con%enio en el nom+rado: ?s es el plural de ?, y ??s de+e leerse: Iuna ? seguida de %arias ?. $ste ejemplo, además de intuiti%o, enfati0a un aspecto importante de asell que de+emos aclarar: la comparaci(n de patrones - pattern matching). Los miem+ros i0quierdos de las ecuaciones contienen patrones tales como BD y ??s. $n una aplicaci(n o llamada a la funci(n, estos patrones son comparados con los argumentos de la llamada de forma intuiti%a -BD solo IconcuerdaI -matc)es o puede emparejarse con la lista %acia, y ??s se podrá emparejar con una lista de al menos un elemento, instanciándose ? a este primer elemento y ?s al resto de la lista. Si la comparaci(n tiene éxito, el miem+ro i0quierdo es e%aluado y de%uelto como resultado de la aplicaci(n. Si falla, se intenta la siguiente ecuaci(n, y si todas fallan, el resultado es un error. La definici(n de funciones a tra%és de comparaci(n de patrones es usual en asell, y el usuario de+erá familiari0arse con los distintos tipos de patrones que se permiten6 %ol%eremos a esta cuesti(n en la Secci(n . La funci(n length es tam+ién un ejemplo de funci(n polim(rfica. *uede aplicarse a listas con elementos de cualquier tipo, por ejemplo B/ntegerD , BEharD , o BB/ntegerDD . A C length B=a=%=b=%=c=D A C length BB1D%B2D%BCDD A C length
B1%2%CD
e aqu7 dos funciones polim(rficas muy &tiles so+re listas, que usaremos más tarde. La funci(n head de%uel%e el primer elemento de una lista, y la funci(n tail de%uel%e la lista sal%o el primero: head head (??s)
BaD @A a ?
tail tail (??s)
BaD @A BaD ?s
5l contrario que length, estas funciones no estan definidas para todos los posi+les %alores de su argumento. Cuando las funciones son aplicadas a la lista %ac7a se produce un error en tiempo de ejecuci(n. Femos que algunos tipos polim(rficos son más generales que otros en el sentido de que el conjunto de %alores que definen es más grande. *or ejemplo, el tipo BaD es más general que BEharD. $n otras pala+ras: el tipo BEharD puede ser deri%ado del tipo BaD a tra%és de una sustituci(n adecuada de a. Con respecto a este orden generali0ado, el sistema de tipos de asell tiene dos propiedades importantes: en primer lugar, se garanti0a que toda expresi(n +ien tipificada tenga un &nico tipo principal -descrito después, y en segundo lugar, el tipo principal puede ser inferido automáticamente -K.2.. $n comparaci(n con un lenguaje con tipos monom(rficos como C, el lector encontrará que el polim(rfismo enriquece la expresi%idad, y que la inferencia de tipos reduce la cantidad de tipos usados por el programador. $l tipo principal de una expresi(n o funci(n es el tipo más general que, intuiti%amente, Icontiene todos los ejemplares de la expresi(n.I *or ejemplo, el tipo principal de head es BaD@Aa6 los tipos BbD@Aa , a@Aa, o el propio a son demasiado generales, mientras que algo como B/ntegerD@A/nteger es demasiado concreto. La existencia de un &nico tipo principal es la caracter7stica esencial del sistema de tipos de Hindley-Milner , que es la +ase del sistema de tipos de asell, ;L, ;iranda, -I;irandaI es marca registrada de 'esearc) Softare, Ltd. y otros lenguajes -principalmente funcionales .
2G2G
:i"os definidos "or el usuario
*odemos definir nuestros propios tipos en asell a tra%és de una declaraci(n data, que introduciremos con una serie de ejemplos -K..2. Un dato predefinido importante en asell corresponde a los %alores de %erdad: data ool
alse I :rue
$l tipo definido con tal declaraci(n es ool, y tiene exactamente dos %alores: :rue y alse. ool es un ejemplo de constructor de tipo -sin argumentos, mientras que :rue y alse son constructores de datos -o constructores, para a+re%iar.
$n forma similar, podemos definir un tipo color: data Eolor
8ed I reen I lue I /ndigo I 9iolet
"anto ool como Eolor son ejemplos de tipos enumerados, puesto que constan de un n&mero finito de constructores. $l siguiente es un ejemplo de tipo con un solo constructor de dato: data Hoint a
Ht a a
5l tener un solo constructor, un tipo como Hoint es llamado a menudo un tipo tupla, ya que esencialmente es un producto cartesiano -en este caso +inario de otros tipos. -La tuplas son conocidas en otros lenguajes como registros. *or el contrario, un tipo multiJ constructor, tal como ool o Eolor, se llama una Isuma de tiposI o tipo uni(n -disjunta. Sin em+argo, lo más importante es que Hoint es un ejemplo de tipo polim(rfico: para cualquier tipo t, define el tipo de los puntos cartesianos que usan t como eje de coordenadas. $l tipo Hoint puede tam+ién %erse como un constructor de tipos unario, ya que a partir de un tipo t podemos o+tener un nue%o tipo Hoint t. -$n el mismo sentido, usando el ejemplo de la listas, BD es tam+ién un constructor de tipos: podemos aplicar el constructor BD a un tipo t para o+tener un nue%o tipo BtD. La sintaxis de asell permite escri+ir BtD en lugar de BD t. Similarmente, @A es otro constructor de tipos +inario: dados dos tipos ItI y IuI, t@Au es el tipo de las funciones que aplican datos de tipo ItI a elementos de tipo IuI. ?(tese que el tipo del constructor de datos Ht es a asignaciones de tipos son %álidas: Ht 2G0 CG0 Ht =a= =b= Ht :rue alse
@A a @A Hoint a ,
y las siguientes
(( Hoint )loat
Hoint Ehar Hoint ool
*or otro lado, una expresi(n tal como Ht 1 son de tipos diferentes.
=a= 1 está
err(neamente tipificada, ya que =a= y
$s importante distinguir entre la aplicaci(n de un constructor de datos para o+tener un %alor, y la aplicaci(n de un constructor de tipos para o+tener un tipo6 el primero tiene lugar durante el tiempo de ejecuci(n, que es cuando se computan cosas en asell, mientras que el <imo tiene lugar en tiempo de compilaci(n y forma parte del proceso de tipificado que asegura un Itipo seguroI. OConstructores de tipo como Hoint y constructores de datos como Ht aparecen en ni%eles distintos de la declaraci(n, lo que permite que el mismo nom+re pueda usarse como constructor de tipos y como constructor de datos, como %emos en: data Hoint a Hoint a a
$sto puede lle%ar a una peque9a confusi(n al principio, pero sir%e para crear un enlace o+%io entre el constructor de datos y el de tipo.P
2G2G1G
:i"os recursiJos
Los tipos pueden ser recursi%os, como el siguiente tipo para ár+oles +inarios: data :ree a
7eaf a I ranch (:ree a) (:ree a)
Con ello )emos definido un tipo polim(rfico cuyos elementos son o +ien )ojas conteniendo un %alor de tipo a, o nodos internos -IramasI conteniendo -en forma recursi%a dos su+ár+oles. $n la lectura de declaraciones de datos como la anterior, recordemos que :ree es un constructor de tipos, mientras que ranch y 7eaf son constructores de datos. La declaraci(n anterior, además de esta+lecer una conexi(n entre estos constructores, define esencialmente los tipos para los constructores ranch y 7eaf: ranch 7eaf
:ree a @A :ree a @A :ree a a @A :ree a
Con este ejemplo tenemos un tipo suficientemente rico que permite definir algunas funciones -recursi%as interesantes que )agan uso de éste. *or ejemplo, supongamos que queremos definir una funci(n fringe que de%uel%a todos los elementos de las )ojas de un ár+ol de i0quierda a derec)a. $n primer lugar es esencial escri+ir el tipo de la nue%a funci(n6 en este caso %emos que el tipo de+e ser :ree a @A BaD . $s decir, fringe es una funci(n polim(rfica que, para cualquier tipo a, aplica ár+oles de a so+re listas de a. Una definici(n adecuada es la siguiente: fringe :ree a @A BaD fringe (7eaf ?) B?D fringe (ranch left right) fringe left $$ fringe right
donde $$ es el operador infijo que concatena dos listas -su definici(n completa se %erá en la Section T.2. 5l igual que la funci(n length %ista anteriormente, la funci(n fringe está definida mediante comparaci(n de patrones, sal%o que los patrones implicados son los constructores de la definici(n dada por el usuario: 7eaf y ranch. O?(tese que los parámetros formales son fácilmente identificados ya que comien0an con letras min&sculas.P
2GCG Kin,nimos de :i"os
*or con%eniencia, asell proporciona una forma para definir sinónimos de tipos6 es decir, nom+res de tipos usados %arias %eces. Los sin(nimos de tipo son creados a tra%és de una declaraci(n t"e -K... e aqu7 algunos ejemplos: t"e t"e t"e data
Ktring Herson ame Lddress
BEharD (ame%Lddress) Ktring 2one I Lddr Ktring
Los sin(nimos no definen tipos nue%os, sino simplemente proporcionan nue%os nom+res a tipos ya existentes. *or ejemplo, el tipo Herson @A ame es precisamente equi%alente al tipo (Ktring%Lddress) @A Ktring . Los nom+res nue%os son a menudo más cortos que los tipos nom+rados, pero éste no es el &nico prop(sito de los sin(nimos de tipos: éstos pueden mejorar la legi+ilidad de los programas a tra%és de nemotécnicos6 en efecto, los ejemplos anteriores enfati0an este )ec)o. *odemos dar nue%os nom+res a tipos polim(rficos: t"e Lssoc7ist a b
B(a%b)D
$ste es el tipo de las Ilistas de asociacionesI que asocian %alores de tipo a con otros de tipo b.
2G4G
7os ti"os "redefinidos no son es"eciales
5ntes )emos introducido %arios tipos IpredefinidosI tales como listas, tuplas, enteros y caracteres. "am+ién mostramos como el programador puede definir nue%os tipos. 5demás de una sintaxis especial los tipos predefinidos tienen algo más de especialV La respuesta es no. La sintaxis especial es por con%eniencia y consistencia, junto a algunas ra0ones )ist(ricas, pero no tiene ninguna consecuencia semántica. $nfati0amos este punto diciendo que la apariencia de las declaraciones de éstos tipos predefinidos es especial. *or ejemplo, el tipo Ehar puede ser descrito en la forma: data Ehar MasNell
=a= I =b= I =c= I GGG I =L= I == I =E= I GGG I =1= I =2= I =C= I GGG GGG
@@ sto no es c,digo @@ JOlidoP
Los nom+res de los constructores no son %álidos sintácticamente6 ello lo podr7amos arreglar escri+iendo algo como lo siguiente: data Ehar
Ea I Eb I Ec I GGG I EL I E I EE I GGG I E1 I E2 I EC I GGG
GGG
"ales constructores son más concisos, pero no son los )a+ituales para representar caracteres. $n cualquier caso, la escritura de c(digo IpseudoJasellI tal como la anterior ayuda a aclarar la sintaxis especial. Femos que Ehar es, en efecto, un tipo enumerado compuesto de un gran n&mero de constructores -constantes. *or ejemplo, %isto Ehar de esta forma aclaramos qué patrones pueden aparecer en las definiciones de funciones6 es decir, qué constructores de este tipo podemos encontrarnos. $ste ejemplo tam+ién muestra el uso de los comentarios en asell6 los caracteres @@ y los sucesi%os )asta el final de la l7nea son ignorados. asell tam+ién permite comentarios anidados que tienen las forma {@...@} y pueden aparecer en cualquier lugar -K..P Similarmente, podemos definir /nt -enteros de precisi(n limitada y /nteger en la forma: data /nt @655C2 I GGG I @1 I 0 I 1 I GGG I 655C2 @@ mOs "seudo@ c,digo data /nteger GGG @2 I @1 I 0 I 1 I 2 GGG
donde @655C2 y 655C2, representan el mayor y el menor entero en precisi(n fija para una implementaci(n concreta. /nt es un tipo enumerado más largo que Ehar, pero es finitoW *or el contrario, el pseudoJc(digo para /nteger -el tipo de los enteros con precisi(n ar+itraria de+e %erse como un tipo enumerado infinito. Las tuplas tam+ién son fáciles de definir en la misma forma: data (a%b) c,digo data (a%b%c) data (a%b%c%d) G G G
(a%b)
@@ mOs "eudo@
(a%b%c) (a%b%c%d)
G G G
Cada una de las declaraciones anteriores define una tupla de una longitud particular, donde (GGG) juega distintos papeles: a la i0quierda como constructor de tipo, y a la derec)a como constructor de dato. Los puntos %erticales después de la <ima declaraci(n indican un n&mero infinito de tales declaraciones, reflejando el )ec)o de que en asell están permitidas las tuplas de cualquier longitud. La listas son manipula+les fácilmente, y lo que es más importante, son recursi%as: data BaD c,digo
BD I a BaD
@@ mOs "eudo@
Femos que esto se ajusta a lo ya dic)o so+re listas: BD es la lista %ac7a, y es el constructor infijo de listas6 de esta forma B1%2%CD es equi%alente a la lista 12CBD. - es asociati%o a la derec)a. $l tipo de BD es BaD, y el tipo de es a@ABaD@ABaD .
O/e esta forma II está definido con una sintaxis legalJJJlos constructores infijos se permiten en declaraciones data, y -para descri+ir la comparaci(n de patrones son distinguidos de los operadores infijos ya que comien0an con el carácter II -una propiedad satisfec)a tri%ialmente por II.P $n este punto, el lector de+erá notar con cuidado las diferencias entre tuplas y listas, ya que las definiciones anteriores lo aclaran suficientemente. $n particular, n(tese la naturale0a recursi%a de las listas, con longitud ar+itraria y cuyos elementos son )omogéneos, y la naturale0a no recursi%a de una tupla concreta, que tiene una longitud fija, en la cual los elementos son )eterogéneos. Las reglas de tipificado para tuplas y listas de+er7an quedar claras a)ora: *ara (e2%e%...%en), nNM, si ti es el tipo de ei, entonces el tipo de la tupla es (t2%t%...%tn). *ara Be2%e%...%enD, nNMR, cada ei de+e tener el mismo tipo t, y el tipo de la lista es BtD.
2G4G1 7istas "or com"rensi,n Kecuencias LritmQticas
Como en algunos dialectos de Lisp, las listas son muy &tiles en asell, y al igual que en otros lenguajes funcionales, existe a&n una sintaxis más adecuada para su descripci(n. 5demás de los constructores de listas ya introducidos, asell proporciona expresiones conocidas como listas por comprensión que introducimos con un ejemplo: B f ? I ?
View more...
Comments