나는 나는 또한 Tup2List
하나를 가지고 필요 생각 나는 GTag t
에 대한 GEq
인스턴스를 작성하려는 Tup2List
및 GTag
이 GEq 인스턴스를 작성하려면 어떻게해야합니까?
(How can I produce a Tag type for any datatype for use with DSum, without Template Haskell?에 대한 대답에서) 데이터 유형을 가지고있다. 이 인스턴스를 작성하려면 어떻게해야합니까?
왜 부분적으로 그런 것이 없기 때문에 내 생각 엔 맞습니다. Refl
- Refl을 제공하는 컴파일러에 대해 전체 구조를 모두 일치시켜야하지만, 가장 바깥 쪽 생성자를 풀고 다시 생성하십시오.
내 코드는 undefined
으로 작성하는 방법을 모르겠습니다.
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}
module Foo where
import Data.GADT.Compare
import Generics.SOP
import qualified GHC.Generics as GHC
data Tup2List :: * -> [*] -> * where
Tup0 :: Tup2List() '[]
Tup1 :: Tup2List x '[ x ]
TupS :: Tup2List r (x ': xs) -> Tup2List (a, r) (a ': x ': xs)
instance GEq (Tup2List t) where
geq Tup0 Tup0 = Just Refl
geq Tup1 Tup1 = Just Refl
geq (TupS x) (TupS y) =
case x `geq` y of
Just Refl -> Just Refl
Nothing -> Nothing
newtype GTag t i = GTag { unTag :: NS (Tup2List i) (Code t) }
instance GEq (GTag t) where
geq (GTag (Z x)) (GTag (Z y)) = undefined -- x `geq` y
geq (GTag (S _)) (GTag (Z _)) = Nothing
geq (GTag (Z _)) (GTag (S _)) = Nothing
geq (GTag (S x)) (GTag (S y)) = undefined -- x `geq` y
편집 : 내 데이터 유형이 변경되었지만 여전히 동일한 핵심 문제에 직면하고 있습니다. 현재 정의는
data Quux i xs where Quux :: Quux (NP I xs) xs
newtype GTag t i = GTag { unTag :: NS (Quux i) (Code t) }
instance GEq (GTag t) where
-- I don't know how to do this
geq (GTag (S x)) (GTag (S y)) = undefined
최고. 그리고 저는 많은 어려움없이 '[a] 제약 조건을 일반화 할 수있었습니다. (이 코드는 라이브러리에 들어가기위한 것이고 임의의 최종 사용자 유형으로 작동해야합니다.) – ajp
나는 다음 걸림돌을 쳤다 - https://stackoverflow.com/questions/40710801/how-can-i-write-function-to-convert-generic-type-to-tag-shaped-type-for- ~와 함께 – ajp