Haskell Language
書き換えルール(GHC)
サーチ…
オーバーロードされた関数のリライト規則の使用
この質問では 、@ Viclibは書き換えルールを使ってtypeclassの法則を利用して、いくつかのオーバーロードされた関数呼び出しを排除することについて尋ねました。
次のクラスに気をつけてください:
class ListIsomorphic l where toList :: l a -> [a] fromList :: [a] -> l a
私はまた
toList . fromList == id
要求するtoList . fromList == id
。 GHCにその置換を命じるための書き換えルールを書くにはどうすればいいですか?
オーバーロードされた関数は GHCによって暗黙のうちに作成されるルールによって特定のインスタンスメソッドに書き換えられるので、これはGHCのリライトルールメカニズムにとってはやや難しい使用例です( fromList :: Seq a -> [a]
はSeq$fromList
などに書き換えられます)。
しかし、まずtoList
とfromList
を非インライン非型クラスメソッドに書き直すことで、早期の書き換えからそれらを保護し 、コンポジションのルールが起動するまでそれらを保持することができます:
{-# RULES
"protect toList" toList = toList';
"protect fromList" fromList = fromList';
"fromList/toList" forall x . fromList' (toList' x) = x; #-}
{-# NOINLINE [0] fromList' #-}
fromList' :: (ListIsomorphic l) => [a] -> l a
fromList' = fromList
{-# NOINLINE [0] toList' #-}
toList' :: (ListIsomorphic l) => l a -> [a]
toList' = toList
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow