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.
(&&), (||) 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.
