Haskell 使用类型族限制输出
我已经编写了这段代码,我正在尝试使用Haskell类型族为其添加约束。我想强制输出总是一个翻转,这个代码可以吗Haskell 使用类型族限制输出,haskell,Haskell,我已经编写了这段代码,我正在尝试使用Haskell类型族为其添加约束。我想强制输出总是一个翻转,这个代码可以吗 {-# LANGUAGE GADTs, TypeFamilies #-} module TF where data Even data Odd data Coin where Up :: Coin Down :: Coin type family Flip n :: * type instance Flip Even = Odd type instance Flip O
{-# LANGUAGE GADTs, TypeFamilies #-}
module TF where
data Even
data Odd
data Coin where
Up :: Coin
Down :: Coin
type family Flip n :: *
type instance Flip Even = Odd
type instance Flip Odd = Even
up = Up
down = Down
flip Up = Down
flip Down = Up
将我的评论放在回答中:
{-# LANGUAGE GADTs, DataKinds, TypeFamilies #-}
data Parity = Even | Odd
data Coin :: Parity -> * where
Up :: Coin Even
Down :: Coin Odd
type family Flip (p :: Parity) :: Parity where
Flip Even = Odd
Flip Odd = Even
flip :: Coin p -> Coin (Flip p)
flip Up = Down
flip Down = Up
将我的评论放在回答中:
{-# LANGUAGE GADTs, DataKinds, TypeFamilies #-}
data Parity = Even | Odd
data Coin :: Parity -> * where
Up :: Coin Even
Down :: Coin Odd
type family Flip (p :: Parity) :: Parity where
Flip Even = Odd
Flip Odd = Even
flip :: Coin p -> Coin (Flip p)
flip Up = Down
flip Down = Up
向上/向下
和偶数/奇数
是如何关联的?如果Up
始终是偶数
,那么您可以通过奇偶校验对硬币
进行索引,如下所示:数据奇偶校验=偶数|奇数
,数据硬币::奇偶校验->*其中Up::硬币偶数;向下:奇数硬币
。然后flip::Coin p->Coin(flip p)
@user3237465谢谢你的帮助。我厌倦了像这样使用你的例子,但它不起作用。我遗漏了什么?@Oleander您遗漏了{-#LANGUAGE DataKinds#-}
@Oleander您还需要更改Flip
,以使结果是类奇偶校验
而不是*
,并且Flip
的定义中存在不应该存在的递归。此外,你应该考虑封闭型家庭。我觉得它们通常更容易思考,因为它们更受限制。向上/向下
和偶数/奇数
有什么关系?如果Up
始终是偶数
,那么您可以通过奇偶校验对硬币
进行索引,如下所示:数据奇偶校验=偶数|奇数
,数据硬币::奇偶校验->*其中Up::硬币偶数;向下:奇数硬币
。然后flip::Coin p->Coin(flip p)
@user3237465谢谢你的帮助。我厌倦了像这样使用你的例子,但它不起作用。我遗漏了什么?@Oleander您遗漏了{-#LANGUAGE DataKinds#-}
@Oleander您还需要更改Flip
,以使结果是类奇偶校验
而不是*
,并且Flip
的定义中存在不应该存在的递归。此外,你应该考虑封闭型家庭。我觉得它们通常更容易思考,因为它们更受限制。