2012-06-03 12 views
7

Me gustaría implementar el método show para funciones (binarias) y poder distinguir las funciones finales (a -> a).Implementación de "show" para la función

Algo así como el código de pseudo-Haskell:

instance Show (a->b) where 
    show fun = "<<Endofunction>>" if a==b 
    show fun = "<<Function>>" if a\=b 

¿Cómo puedo distinguir los dos casos?

+0

No sería una buena instancia de 'Show' en absoluto. Debería escribir algo como 'isEndo :: (a-> b) -> Bool', y luego usar una protección simple para crear el texto adecuado donde lo desee. – leftaroundabout

+2

¿'const 3' es una función o función? –

+1

@DanielWagner: sí. – Ashe

Respuesta

15

necesita habilitar algunas extensiones:

{-# LANGUAGE OverlappingInstances, FlexibleInstances #-} 
module FunShow where 

instance Show ((->) a a) where 
    show _ = "<<Endofunction>>" 

instance Show ((->) a b) where 
    show _ = "<<Function>>" 

Usted necesita OverlappingInstances desde la instancia a -> b también coincide con endofunctions, por lo que no se solapan, y que necesita FlexibleInstances porque el lenguaje mandatos estándar que las variables de tipo de declaraciones de instancias están distinto.

*FunShow> show not 
"<<Endofunction>>" 
*FunShow> show fst 
"<<Function>>" 
*FunShow> show id 
"<<Endofunction>>" 
Cuestiones relacionadas