GHC Generics를 배우려고합니다. 몇 가지 예를 검토 한 후에 일반 Functor
인스턴스를 만들려고했습니다 (GHC가 나를 위해 자동으로 파생되지 않는다는 것을 무시하고). 그러나 Generics에서 매개 변수화 된 데이터 유형을 사용하는 방법을 알지 못한다는 것을 깨달았습니다. 모든 예제는 친절한 *
입니다. 가능 한가요? 그렇다면 어떻게 할 수 있습니까? SYB와 같은 다른 유사한 프레임 워크에도 관심이 있습니다.GHC.Generics (또는 다른 유사한 프레임 워크)를 사용하여 일반적인 Functor 인스턴스를 생성하는 방법은 무엇입니까?
9
A
답변
8
GHC Generics를 사용하여 많은 예제 기능을 살펴 보는 가장 좋은 장소는 generic-deriving
package입니다. 거기에 Functor
클래스의 일반적인 정의가 있습니다. 복사 Generics.Deriving.Functor
에서 (약간 단순화는) :
class GFunctor' f where
gmap' :: (a -> b) -> f a -> f b
instance GFunctor' U1 where
gmap' _ U1 = U1
instance GFunctor' Par1 where
gmap' f (Par1 a) = Par1 (f a)
instance GFunctor' (K1 i c) where
gmap' _ (K1 a) = K1 a
instance (GFunctor f) => GFunctor' (Rec1 f) where
gmap' f (Rec1 a) = Rec1 (gmap f a)
instance (GFunctor' f) => GFunctor' (M1 i c f) where
gmap' f (M1 a) = M1 (gmap' f a)
instance (GFunctor' f, GFunctor' g) => GFunctor' (f :+: g) where
gmap' f (L1 a) = L1 (gmap' f a)
gmap' f (R1 a) = R1 (gmap' f a)
instance (GFunctor' f, GFunctor' g) => GFunctor' (f :*: g) where
gmap' f (a :*: b) = gmap' f a :*: gmap' f b
instance (GFunctor f, GFunctor' g) => GFunctor' (f :.: g) where
gmap' f (Comp1 x) = Comp1 (gmap (gmap' f) x)
class GFunctor f where
gmap :: (a -> b) -> f a -> f b
default gmap :: (Generic1 f, GFunctor' (Rep1 f))
=> (a -> b) -> f a -> f b
gmap = gmapdefault
gmapdefault :: (Generic1 f, GFunctor' (Rep1 f))
=> (a -> b) -> f a -> f b
gmapdefault f = to1 . gmap' f . from1
당신은 Generic1
보다는 Generic
을 도출해야 데이터 형식에서이 작업을 사용합니다. Generic1
표현의 주요 차이점은 매개 변수 위치를 인코딩하는 Par1
데이터 유형을 사용한다는 것입니다.
3
데이터 유형이 * -> *
인 경우 Generic1
클래스가 있습니다. 이 작업은 매개 변수에 Par1
이라는 점을 제외하고는 종류가 *
인 데이터 유형과 거의 동일합니다. 예를 들어 내 unfoldable package에서 사용했습니다.
관련 문제
- 1. C# 플러그인 프레임 워크를 생성하는 방법은 무엇입니까?
- 2. functor 인스턴스를 다른 functor에 전달
- 3. databasefirst 및 엔티티 프레임 워크를 사용하여 뷰를 생성하는 방법은 무엇입니까?
- 4. 일반적인 Java 코드 내에서 OSGi 프레임 워크를 실행하는 방법은 무엇입니까?
- 5. 내가보기이 유사한 프레임 워크를 형성하는 ZendFramework 컨트롤러가
- 6. 젠드 프레임 워크를 사용하여 다른 템플릿 경로를 설정하는 방법은 무엇입니까?
- 7. 요청에 따라 클래스 인스턴스를 생성하는 방법은 무엇입니까?
- 8. github에서 프레임 워크를 결합하는 최선의 방법은 무엇입니까?
- 9. nodejs/js 프레임 워크를 사용하여 모바일 애플리케이션을 개발하는 방법은 무엇입니까?
- 10. JavaScript로 PDF 프레임 워크를 작성하는 방법은 무엇입니까?
- 11. 엔터티 프레임 워크를 사용하여 GetUTCDate
- 12. 젠드 프레임 워크를 사용하여 json 데이터에서 객체를 변환하는 방법은 무엇입니까?
- 13. .NET에서 사용자 지정 프레임 워크를 만드는 일반적인 단계별 가이드는 무엇입니까?
- 14. 프레임 워크를 함수 라이브러리와 구별하는 방법은 무엇입니까?
- 15. 어셈블리가로드되는 프레임 워크를 식별하는 방법은 무엇입니까?
- 16. 함수에 다른 함수를 포함 : functor 또는 lambda?
- 17. 일반적인 데이터 수집을 위해 Java ThreadLocal을 사용하는 프레임 워크를 찾으십시오.
- 18. 다른 정적 라이브러리/프레임 워크를 참조하는 iOS 정적 프레임 워크를 만드는 방법은 무엇입니까?
- 19. 그래프와 유사한 프레임 워크를 편집하는 C++ 멀티미디어 찾기?
- 20. iPhone 용 라이브러리 또는 프레임 워크를 만드는 방법은 무엇입니까?
- 21. 프로젝트에서 프레임 워크를 적용하는 방법은 무엇입니까?
- 22. Joomla를위한 템플릿 프레임 워크를 만드는 방법은 무엇입니까?
- 23. 모델의 인스턴스를 나열하고 동일한보기에서 인스턴스를 생성하는 양식을 갖는 방법은 무엇입니까?
- 24. CentOS에서 Play 프레임 워크를 작동시키는 방법은 무엇입니까?
- 25. 단위 프레임 워크를 테스트하는 방법은 무엇입니까?
- 26. 엔티티 프레임 워크를 사용하여 데이터베이스에서 사용 가능한 dbcontext를 생성하는 방법은 무엇입니까?
- 27. TurboGear 프레임 워크를 사용하여 Python으로 데이터베이스를 변경하는 방법은 무엇입니까?
- 28. iOS에서 aubio 프레임 워크를 사용하는 방법은 무엇입니까?
- 29. 스프링 프레임 워크를 사용하여 RESTful 웹 서비스
- 30. 엔티티 프레임 워크 또는 다른 프레임 워크를 사용하여 이미 존재하는 데이터베이스를 UWP로로드하는 방법
GHC는 자동적으로'Generic1'의 인스턴스를 파생합니까? –
@ PetrPudlák 자동으로 충분하지 않습니다. 그러나'DeriveGeneric' 언어 확장을 사용하면'Deriving Generic'과'Generic1 파생 '을 사용할 수 있습니다 (후자는 적어도 하나의 매개 변수가있는 데이터 유형에만 사용되며 마지막 매개 변수는 종류가 *). – kosmikus
@kosmikus 감사합니다. 불행히도 내 목표를 위해 좀 더 복잡한 종류로 작업하고 싶다. 아마도 Template Haskell을 사용해야 할 것이다. –