どうすればこれを達成できますか?
data SumTerm =
St_TotalSum TotalSum
|St_SumInS SumInS
|St_SumInT SumInT
|St_HTerm HTerm
data Monomial = Monomial {
mSumTerm :: SumTerm,
xPower :: Int,
yPower :: Int,
coefficient :: Int
}
newtype Polynomial = Polynomial [ Monomial ]
{- Ok, here I'm lost, VERY lost -}
toMonomial :: (forall {- a which can be in a SumTerm constructor -} )
=> a -> SumTerm
toMonomial sum_term = ....
もちろん、この解決策は私の頭に浮かびます:
class ToSumTerm a where
toSumTerm :: a -> SumTerm
instance ToSumTerm TotalSum where
toSumTerm total_sum = St_TotalSum total_sum
instance ToSumTerm SumInS where
toSumTerm sum_in_s = St_SumInS sum_in_s
...
toMonomial :: ToSumTerm a => a -> Monomial
toMonomial x = Monomial ( toSumTerm a ) 0 0 1
ただし、SumTerm のコンストラクターに合わせて自動的にスケーリングされるわけではありません。インスタンスを手で書く必要がない簡単な方法はありますToSumTerm
か? 言い換えれば、定型的なインスタンス定義を廃棄する (または同等の効果を達成する) ことを可能にする構文はありますか? 解決策がある場合、それはもちろん、GADT などの GHC 拡張機能を意味する可能性があります。