>>692
Haskellの型変数は、そこにどんな型を代入しても良いということを表す(暗黙の全称量化)
>  func1 :: (Class2 b) => a -> b
だから、これだと、func1はClass2のインスタンスであるようなbならどれでも生成できるという意味になる
Class1 Type1の実装ではType2という特定の型の値しか返せないので、これに適合しない

意図としては、func1はClass2の「何らかの」インスタンスbの値を生成する、と言いたいんだろう
そういう場合、Haskell98にはないけど、GHCなら(たぶんHugsでも)存在量化という言語拡張が使える

{-# LANGUAGE ExistentialQuantification #-}
class Class1 a where
  func1 :: a -> SomeInstanceOfClass2

class Class2 a where
  func2 :: a -> String

data SomeInstanceOfClass2 = forall a. (Class2 a) => SIOC2 a