para online mac descargar compiler haskell-platform haskell haskelldb

haskell-platform - online - winghci 32 bits



¿Cómo creo un operador en Haskell? (4)

Hacer una tabla lógica ternaria, y me gustaría hacer mi propia función para un operador al que llamaré <=> .

Entonces, por ejemplo, quiero hacer esto, pero eso no está bien. ¿Cuál es la forma correcta de hacer esto?

data Ternary = T | F | M deriving (Eq, Show, Ord) <=> :: Ternary -> Ternary -> Ternary <=> T F = F <=> T T = T <=> T M = M <=> F F = T <=> F T = F <=> F M = M <=> M F = M <=> M T = M <=> M M = T


Como tienes Eq y Ord , puedes hacer lo siguiente:

data Ternary = T | F | M deriving (Eq, Show, Ord) (<=>) :: Ternary -> Ternary -> Ternary x <=> y = if x == y then T else max x y

Si resulta que lo cambias para que M <=> M == M , entonces puedes hacer lo siguiente:

data Ternary = M | T | F deriving (Eq, Show, Ord, Enum) (<=>) :: Ternary -> Ternary -> Ternary x <=> y = fromEnum $ rem (toEnum x * toEnum y) 3


Los nombres de funciones con símbolos tienen una sintaxis diferente a los que no tienen:

-- Works: (<^>) :: Int -> Int -> Int a <^> b = a + b -- Doesn''t work: {- <^> :: Int -> Int -> Int <^> a b = a + b -} -- Works: letters :: Int -> Int -> Int letters a b = a + b -- Doesn''t work: {- (letters) :: Int -> Int -> Int a letters b = a + b -}

Sin embargo, lo prometo: Haskell merece la pena aprender las complejas reglas.


Puede simplificar (en línea) la definición de la siguiente manera:

(<=>) :: Ternary -> Ternary -> Ternary T <=> T = T F <=> F = T M <=> M = T M <=> _ = M _ <=> M = M _ <=> _ = F


Solo agregue paréntesis alrededor de su operador:

(<=>) :: Ternary -> Ternary -> Ternary (<=>) T F = F (<=>) T T = T (<=>) T M = M (<=>) F F = T (<=>) F T = F (<=>) F M = M (<=>) M F = M (<=>) M T = M (<=>) M M = T

Esto lo convierte de forma de infijo a forma de prefijo. Alternativamente, puedes usar infijo en la definición:

(<=>) :: Ternary -> Ternary -> Ternary T <=> F = F T <=> T = T T <=> M = M F <=> F = T F <=> T = F F <=> M = M M <=> F = M M <=> T = M M <=> M = T