Funkcja globalna i funkcja w klasie

0

Czy w Haskellu można mieć dwie funkcje o tej samej nazwie - jedną w klasie a drugą globalną?
Czy istnieje taka separacja jak w językach obiektowych?

Z poniższego kodu wnioskuję, że nie ma takiej separacji, mimo to my_show z instancji klasy MyShow
wydaje się należeć tylko do tej klasy.

data MyBool = MyTrue | MyFalse

instance Eq MyBool where
  MyTrue == MyTrue = True
  _ == _ = False

class MyShow a where  
  my_show :: a -> String

instance MyShow MyBool where  
  my_show MyTrue = "MyTrue"
  my_show MyFalse = "MyFalse"

my_show :: MyBool -> String
my_show MyTrue = "fg MyTrue"
my_show MyFalse = "fg MyFalse"

main =
  do
    putStrLn $ s1 ++ " ==> " ++ (show v1)
    putStrLn $ s2 ++ " ==> " ++ (show v2)
    putStrLn $ s3 ++ " ==> " ++ (show v3)
  where
     s1 =  "(" ++ my_show MyTrue ++ " == " ++ my_show MyTrue ++ ") "
     s2 =  "(" ++ my_show MyTrue ++ " == " ++ my_show MyFalse ++ ")"
     s3 =  "(" ++ my_show MyTrue ++ " /= " ++ my_show MyFalse ++ ")"
     v1 = (MyTrue == MyTrue)
     v2 = (MyTrue == MyFalse)
     v3 = (MyTrue /= MyFalse)
     
0

A zasadnicze pytanie, jak wywołał byś "globalną funkcję" my_show a jak "metodę instancji"? Pomyśl a będziesz miał odpowiedź.

BTW zgodnie z konwencją Haskella funkcja powinna się nazywać myShow.

0
winerfresh napisał(a):

A zasadnicze pytanie, jak wywołał byś "globalną funkcję" my_show a jak "metodę instancji"? Pomyśl a będziesz miał odpowiedź.

To że nie wiem, jak można by wywołać taką metodę nie jest wystarczającym dowodem, że nie można jej wywołać. Rozumiem, że odpowiedź jest nie. Dzięki :)

winerfresh napisał(a):

BTW zgodnie z konwencją Haskella funkcja powinna się nazywać myShow.

Dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1