2012-06-03 14 views
7

Chciałbym wdrożyć metodę show dla (binarnych) funkcji i sprawić, by była w stanie odróżnić endofunkcje (a -> a).Implementacja "show" dla funkcji

Coś kodu pseudo-Haskell:

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

Jak można rozróżnić dwa przypadki?

+0

To nie byłaby dobra instancja 'Show' w ogóle. Powinieneś raczej napisać coś w stylu 'isEndo :: (a-> b) -> Bool', a następnie użyć prostej osłony, aby stworzyć odpowiedni tekst tam, gdzie chcesz. – leftaroundabout

+2

Czy "const 3" to endofunkcja lub funkcja? –

+1

@DanielWagner: tak. – Ashe

Odpowiedz

15

Musisz włączyć niektóre rozszerzenia:

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

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

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

Ty potrzebujesz OverlappingInstances ponieważ instancja a -> b pasuje również endofunctions, więc nie pokrywają się, i trzeba FlexibleInstances ponieważ język standardowych mandatów, że zmienne typu w deklaracji instancji są odrębny.

*FunShow> show not 
"<<Endofunction>>" 
*FunShow> show fst 
"<<Function>>" 
*FunShow> show id 
"<<Endofunction>>" 
Powiązane problemy