2012-05-11 13 views
5

Actualmente estoy intentando escribir una pequeña instancia de Show para funciones aritméticas primitivas.Instance Show para la función

El objetivo es hacer una lista de funciones visibles.

La función muy sencilla para la demostración de que se parece a:

showOp :: (Int -> Int -> Int) -> String 
    showOp op 
    | op 3 3 == 6 = "plus" 
    | op 3 3 == 0 = "minus" 
    | op 3 3 == 9 = "times" 
    | op 3 3 == 1 = "divide" 
    | otherwise = "undefined" 

Pero no se puede obtener una instancia del Show para (Int -> Int -> Int). Lo intenté así:

instance Show (Int -> Int -> Int) where 
    show op = show "asdf" 

Pero no funciona. WinHugs simplemente devuelve el error

Syntax error in instance head (variable expected) 

¿Es posible definir Show para funciones? Si es así, ¿cómo podría abordar ese problema?

Respuesta

6

No utilice WinHugs. Usa GHC.

De hecho, en las últimas versiones de la plataforma Haskell ya hay una instancia de funciones para Show.

Prelude Text.Show.Functions> show (+1) 
"<function>" 
Prelude Text.Show.Functions> show (\x -> x ++ "foo") 
"<function>" 

Ahora, en su caso, sin embargo, es necesario -XFlexibleInstances en adelante, ya que su caso no es de la forma (Constructor a1 .. an) donde A1 .. An están las variables de tipo diferenciado.

Encenderlo con {-# LANGUAGE FlexibleInstances #-}

+0

Dicho esto, no es posible definir 'Show' para brindarle más detalles sobre la función. –

+1

Claro que sí. Puede mostrar el tipo (dado a través de Typeable); o puede mostrar algunas de las entradas y salidas (como se hace en QuickCheck). –

+0

... Sí. Bueno. Lo siento. Sin embargo, no puede mostrar la implementación o el nombre. –

3

(Esto no es una respuesta (Don de lo cubre), pero es demasiado largo para un comentario)

El código tiene una gran cantidad de lógica repetida (en concreto op 3 3 == ocurre mucho), pero no queda nada para hacer este limpiador: case expressions. Esto nos permite calcular op 3 3 una vez, y luego manejar los diferentes casos (exactamente lo mismo que la coincidencia de patrones en las definiciones de funciones).

showOp op = case op 3 3 of 
       6 -> "plus" 
       0 -> "minus" 
       9 -> "times" 
       1 -> "divide" 
       _ -> "undefined" 
1

También puede utilizar los abrazos.

Comience abrazos con hugs -98 +o o runhugs -X-98 +o y use {-# LANGUAGE FlexibleInstances #-} en el archivo de origen.