Mam pytanie: Jak mogę przesłonić metodę show dla String lub Char? Dzięki.Metoda przesłonięcia show dla String/Char w Haskell
Odpowiedz
Jeśli chcesz to zrobić, robisz to źle.
Dla bardziej technicznego powodu, patrz my answer na poprzednie pytanie.
Ty naprawdę powinien być używany zarówno własne a -> String
funkcji (ewentualnie za pośrednictwem własnego typu klasy) lub użyć ładnego drukowania bibliotekę dla bardziej szczegółowych wyjść (z których niektóre mają już wbudowany Pretty
klasę).
Ponieważ ludzie wydają się podoba mój komentarz, to jest tutaj jako odpowiedź:
Jeśli chcesz reimplement zajęcia typu na istniejących typów, można owinąć je w newtype
typu -declared. Pozwala to na zdefiniowanie własnych implementacji bez rzeczywistego narzutu w czasie wykonywania (ponieważ newtype
jest izomorficzny w stosunku do oryginalnego typu, nie ma faktycznego boksowania w środowisku wykonawczym).
Może to wyglądać mniej więcej tak:
newtype MyChar = MyChar Char
instance Show MyChar where
show (MyChar c) = "head \"" ++ c : "\""
Możesz użyć tego owijając Char
S z MyChar
, tak:
print $ fmap MyChar "test"
To będzie wydrukować
[head "t",head "e",head "s",head "t"]
Możesz także zdefiniować showList, a następnie listy MyChar będą miały również niestandardowe formatowanie. W rzeczywistości dlatego wyświetlanie list znaków ([Char]) zachowuje się inaczej niż pokazywanie innych list ([a]). – sdcvvc
Czy istnieje powód, dla którego nie chcesz definiować innych funkcji typu "Char -> String' lub" String -> String'? Dlaczego chcesz zastąpić 'show'? – hammar
Myślę, że musisz zawinąć go w [nowy typ] (http://www.haskell.org/haskellwiki/Newtype) i zdefiniować opcję Pokaż dla tego typu. –