수색…


오버로드 된 함수에 다시 쓰기 규칙 사용

이 질문 에서 @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 등으로 재 작성).

그러나 먼저 fromListfromList 를 비 - 인라인 비 - toList 메소드로 재 작성함으로써 조기 재 작성으로부터 이들을 보호하고 컴포지션의 규칙이 실행될 때까지 보존 할 수 있습니다.

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