Tutorial Haskell #3: Funciones lógicas

Las funciones lógicas son las que toman cualquier tipo o cantidad de argumentos y regresan un Bool. No necesitan que los argumentos sean números; solamente hace falta que el tipo de los argumentos sea instancia de la clase de tipos Ord (i.e. que exista algún orden definido para ese tipo).

Todos los números "convencionales" (eso es, todos los tipos de datos que son instancia de la clase de tipos Num) son instancia de Ord, pero no son los únicos. (Más detalles sobre clases de tipos en una entrega posterior). Por ejemplo, los caracteres también tienen orden:

Prelude> 'a' < 'z'
True

Las siguientes funciones lógicas están definidas en la biblioteca base de Haskell.

(<), (<=), (>=), (>) hacen lo esperado.

Prelude> 2 < 2
False
Prelude> 2 < 3
True
Prelude> 2 <= 2
True
-- etc...

(==) es comparación de igualdad, (/=) es comparación de desigualdad. Para poder hacer pruebas de igualdad no hace falta que los tipos sean instancia de Ord, es suficiente con que sean instancia de Eq (eso es, que se haya definido el concepto de "igualdad" para ese tipo).

Prelude> 2 == 2
True
Prelude> 2 /= 2
False
Prelude> 2 == 3
False
Prelude> 2 /= 3
True

compare regresa LT si el primer argumento es menor que el segundo, EQ si son iguales, y GT si el primer argumento es mayor que el segundo. LT, EQ y GT son datos específicamente creados para definir orden; no son números, texto ni nada así. Son datos de tipo Ordering (más detalles sobre declaración de datos en un próximo tutorial).

Prelude> compare 2 3
LT
Prelude> compare 3 3
EQ
Prelude> compare 3 2
GT
Prelude> :t GT
GT :: Ordering

Intermedio: un ejemplo de cómo se pueden utilizar operaciones lógicas en datos construídos que no tienen realmente significado numérico.

Prelude> (compare 2 3) == (compare 3 4) -- LT == LT
True
Prelude> (compare 2 3) < (compare 3 4) -- LT < LT
False
Prelude> (compare 2 3) < (compare 3 3) -- LT < EQ
True

Se puede hacer porque el que declaró los datos LT, EQ y GT dejó dicho, en alguna parte, que son iguales solamente a sí mismos y que LT < EQ < GT. Es una construcción totalmente artificial.

max, min regresan el mayor o el menor de dos valores, respectivamente.

Prelude> max 2 3 
3
Prelude> min 2 3
2

(&&), (||) son las operaciones "Y", "O" respectivamente entre valores de tipo Bool:

Prelude> True && True
True
Prelude> True && False
False
Prelude> True || False
True
Prelude> False || False
False

not es la negación lógica de un valor tipo Bool:

Prelude> not True
False

otherwise es un alias para True; se utiliza cuando se quiere decir "en otro caso..." en una estructura de control.

Prelude> otherwise 
True

Solamente para tipos enteros:

even, odd dicen si un número es par o impar, respectivamente.

Prelude> even 3
False
Prelude> even 4
True
Prelude> odd 3
True
Prelude> odd 4
False

Powered by Drupal, an open source content management system