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跟踪每个值使用了哪个构造函数