这两种类型是同构的,但只有ZeroF
的单向类型同义词略有限制,对此我不确定是否有出路。
data NatF x = NatF { unNatF :: (forall u. Either u x) }
pattern ZeroF <- NatF (Left _)
pattern SuccF n = NatF (Right n)
data PeanoF x = ZeroFP | SuccFP x -- isomorphe
我做错了什么(除了人为的例子......)?
答案 0 :(得分:4)
你遇到了麻烦,因为你的假设是错误的。 forall u. Either u x
与PeanoF x
不同构。后者与Either () x
(或仅Maybe x
)同构;前者与x
同构。
newtype NatF x = NatF (Maybe x)
pattern ZeroF = NatF Nothing
pattern SuccF n = NatF (Just n)