このtoDSum
機能を実装するにはどうすればよいですか?私はベースケースをコンパイルすることに成功しましたが、すべての型情報を再帰呼び出しに渡す方法はわかりません。再発を試みる前に、タイプからCode
を取り除かなければなりませんか?実際にコードを簡素化した、ジェネリック型をタグ型に変換してDSumで使用する関数を書くにはどうしたらいいですか?
(これはHow can I write this GEq instance?にフォローされる)
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Foo where
import Data.Dependent.Sum
import Data.GADT.Compare
import Data.Proxy
import Generics.SOP
import qualified GHC.Generics as GHC
type GTag t = GTag_ (Code t)
newtype GTag_ t (as :: [*]) = GTag (NS ((:~:) as) t)
instance GEq (GTag_ t) where
geq (GTag (Z Refl)) (GTag (Z Refl)) = Just Refl
geq (GTag (S x)) (GTag (S y)) = GTag x `geq` GTag y
geq _ _ = Nothing
toDSum :: forall t . Generic t => t -> DSum (GTag t) (NP I)
toDSum = foo . unSOP . from
where
foo ::()
=> NS (NP I) (Code t)
-> DSum (GTag t) (NP I)
foo = bar (Proxy :: Proxy t)
bar :: forall t1 .()
=> Proxy t1 -> NS (NP I) (Code t1)
-> DSum (GTag t1) (NP I)
bar _ (Z x) = GTag (Z Refl) :=> x
bar _ (S x) = undefined
おそらくCode'可能な限り '避ける方がいいでしょう。文脈上、それがコードであるか、まったく多態的なままにすることができますか? – dfeuer
'GTag t'は' DSum'に適合するが、 'GTag_t'(' Code'が追加されていない)は必要ないと思う。私は間違っているかもしれません。完全な文脈については、私はこのファイルhttps://github.com/anderspapitto/reflex-sumtype-render/blob/master/src/ReflexHelpers.hsに取り組んでいます。これはパズルの最後に欠けている部分です。感謝! – ajp