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
등으로 재 작성).
그러나 먼저 fromList
와 fromList
를 비 - 인라인 비 - 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