サーチ…


オーバーロードされた関数のリライト規則の使用

この質問では 、@ 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などに書き換えられます)。

しかし、まずtoListfromListを非インライン非型クラスメソッドに書き直すことで、早期の書き換えからそれらを保護し 、コンポジションのルール起動するまでそれらを保持することができます:

{-# 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