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 に答える