我正在使用该genifunctors包为其定义涉及类型族的类型生成仿函数实例.
第一个模块定义数据类型本身:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
module Temp where
data Record (p :: (*,*))
type family Fst p where Fst (Record '(a,b)) = a
type family Snd p where Snd (Record '(a,b)) = b
data Bar s = Bar {
field_a :: Fst s,
field_b :: Snd s
}
newtype Baz a = Baz { getBaz :: Bar (Record '(Maybe a, [a])) }
Run Code Online (Sandbox Code Playgroud)
这与预期一样:
?> import Temp
?> :t Baz …Run Code Online (Sandbox Code Playgroud)