2

我怎样才能编写一个类似int gog(float i)and的函数float gog(int i)(通常称为“重载”)?一些简单的重载可以通过

class PP a where
  gog :: a -> Int

instance PP Bool where
  gog _ = 1

instance PP Char where
  gog _ = 1

但是上面的例子只是使参数多态。如果我们想让参数和结果都多态,我们必须这样写:

class PP a where
  gog :: Uu b => a -> b

class UU a where
  -- This function can convert between different types of UU.
  fromUuToUu :: UU b => a -> b 

没有fromUuToUu,结果中的多态性gog是不可能的。但我不会写fromUuToUu,这与这个问题的主题有关,即如何制作一个参数和结果都是多态的函数。

4

1 回答 1

6
{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances #-}

class Poly a b where
  gog :: a -> b

instance Poly Int String where
  gog = show

instance Poly String Int where
  gog = read

instance Poly Int Float where
  gog = fromIntegral

instance Poly Float Float where
  gog = (*) 2

gog现在是“完全”多态的。

于 2012-12-24T11:14:45.350 回答