Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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,我正在看一些例子,看看更复杂的数据定义是如何工作的,例如 data DualMap a b = DualMap (Map a b) (Map b a) data Store s a = Store (s -> a) s deriving Functor data Fold a b = forall x . Fold (x -> a -> x) x (x -> b) data Pair a b = Pair !a !b type Rule m a = (m -> a)

我正在看一些例子,看看更复杂的
数据
定义是如何工作的,例如

data DualMap a b = DualMap (Map a b) (Map b a)
data Store s a = Store (s -> a) s deriving Functor
data Fold a b = forall x . Fold (x -> a -> x) x (x -> b)
data Pair a b = Pair !a !b
type Rule m a = (m -> a) -> a
data RingZipper a = RingZipper {
    before :: V.Vector a,
    focus  :: a,
    after  :: V.Vector a
} deriving(Eq, Generic, NFData)
我对其中一些问题有几个简短的问题

首先,这里是
[a]a[a]
的含义:

data Universe a = Universe [a] a [a]
下一步,不确定以下内容是如何工作的。它似乎说用一种奇怪的方式从所有相同的元素中创建一个列表。我的意思是我不明白传入
BExpr
意味着什么

data BExpr = BoolConst Bool
           | Not BExpr
           | BBinary BBinOp BExpr BExpr
           | RBinary RBinOp AExpr AExpr
那是我的

接下来,想知道
[a][(a,a)]
在中是什么意思,或者它是如何解决的

data Digraph a = DG [a] [(a,a)] deriving (Eq,Ord,Show)
还有一些我没有问题

type Monomial coefficient exponent  = (coefficient, exponent)

最后,从
MergeL sa sb a
vs.
merge sa sb a
如何被选中,我看不出来

data MergeState sa sb a
  = MergeL sa sb a
  | MergeR sa sb a
  | MergeLeftEnded sb
  | MergeRightEnded sa
  | MergeStart sa sb
代数数据类型 代数数据类型是您想要查看的数据类型,它们可用于定义树、代数表达式和解析指令等数据

  • 数据宇宙a=宇宙[a]a[a]
这定义了一个新的数据类型宇宙,它保存类型为
a
(可以是任何类型)的数据,您可以使用一个列表、一个元素和另一个列表进行构造。它说的不多,我也不能给出一个你什么时候会使用它的例子,但如果你有一个,我可以向你解释。(编辑:查看第一条注释)需要注意的是,您可以使用它进行模式匹配,因此您可以使用以下功能:

    f :: Universe a        -> a
    f (Universe _ 0 _)      = 0
    f (Universe (x:xs) z ys = x
  • 数据BExpr=BoolConst Bool
    |不是BExpr
    |BBinary BBinOp BExpr BExpr
    |RBinary RBinOp AExpr AExpr
    
这再次定义了一种新的递归数据类型,它是最常用的类型。管道
|
构造函数的意思是“或”,即您的类型BExpr可以是:

  • BoolConst Bool
    :在其他类型中定义的布尔常量(真/假)
  • 非BExpr
    :另一个表达式的否定
  • 包含一个运算符和两个要应用该运算符的表达式的其他表达式
举个简单的例子,想想

Data Tree a = Leaf a | Node (Tree a) a (Tree a)
这就是大多数树的定义方式:您的数据可以是叶子,也可以是包含两棵树和一些数据的节点

有关更多信息,请查看以下两个链接:

  • 数据有向图a=DG[a][(a,a)]推导(Eq,Ord,Show)
    这与
    宇宙a
    完全相同,它保存了一些数据,并且构造了
    [a]
    列表和元组列表
    (a,a)
    。同样,您可以使用模式匹配
对于最后一种,它们也是为该类型调用构造函数的不同方法

代数数据类型 代数数据类型是您想要查看的数据类型,它们可用于定义树、代数表达式和解析指令等数据

  • 数据宇宙a=宇宙[a]a[a]
这定义了一个新的数据类型宇宙,它保存类型为
a
(可以是任何类型)的数据,您可以使用一个列表、一个元素和另一个列表进行构造。它说的不多,我也不能给出一个你什么时候会使用它的例子,但如果你有一个,我可以向你解释。(编辑:查看第一条注释)需要注意的是,您可以使用它进行模式匹配,因此您可以使用以下功能:

    f :: Universe a        -> a
    f (Universe _ 0 _)      = 0
    f (Universe (x:xs) z ys = x
  • 数据BExpr=BoolConst Bool
    |不是BExpr
    |BBinary BBinOp BExpr BExpr
    |RBinary RBinOp AExpr AExpr
    
这再次定义了一种新的递归数据类型,它是最常用的类型。管道
|
构造函数的意思是“或”,即您的类型BExpr可以是:

  • BoolConst Bool
    :在其他类型中定义的布尔常量(真/假)
  • 非BExpr
    :另一个表达式的否定
  • 包含一个运算符和两个要应用该运算符的表达式的其他表达式
举个简单的例子,想想

Data Tree a = Leaf a | Node (Tree a) a (Tree a)
这就是大多数树的定义方式:您的数据可以是叶子,也可以是包含两棵树和一些数据的节点

有关更多信息,请查看以下两个链接:

  • 数据有向图a=DG[a][(a,a)]推导(Eq,Ord,Show)
    这与
    宇宙a
    完全相同,它保存了一些数据,并且构造了
    [a]
    列表和元组列表
    (a,a)
    。同样,您可以使用模式匹配

对于最后一个问题,它们是调用该类型构造函数的不同方法

我现在没有时间给出详细的答案(打电话没有帮助),但您所问的大多数问题都只是将值传递给构造函数的类型。例如,
Universe
是一个构造函数,它获取一个
a
列表、一个
a
列表和另一个列表,并生成一个
Universe a
值。所有
宇宙a
值都可以通过这种方式生成。对于具有管道字符的定义,管道将分隔可以生成这些值的不同构造函数。Haskell跟踪每个值使用了哪个构造函数,例如可以对其进行模式匹配。这篇文章中有太多不相关的问题。我现在没有时间给出详细的答案(打电话也没用),但你所问的大多数事情都是你将值传递给构造函数的简单类型。例如,
Universe
是一个构造函数,它获取一个
a
列表、一个
a
列表和另一个列表,并生成一个
Universe a
值。所有
宇宙a
值都可以通过这种方式生成。对于具有管道字符的定义,管道将分隔可以生成这些值的不同构造函数。Haskell跟踪每个值使用了哪个构造函数