Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用类型族限制输出_Haskell - Fatal编程技术网

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

我已经编写了这段代码,我正在尝试使用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 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
的定义中存在不应该存在的递归。此外,你应该考虑封闭型家庭。我觉得它们通常更容易思考,因为它们更受限制。