Haskell中的某些“数据”定义如何得到评估

时间:2019-02-18 18:12:54

标签: haskell

我正在查看一些示例,以了解更复杂的'down'定义的工作原理,例如这些。...

data

我对其中一些有一些快速的疑问。

首先,这里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

那是来自this的。

接下来,想知道data BExpr = BoolConst Bool | Not BExpr | BBinary BBinOp BExpr BExpr | RBinary RBinOp AExpr AExpr here中是什么意思,或者如何解决它。

[a] [(a,a)]

其他一些我没有问题...

data Digraph a = DG [a] [(a,a)] deriving (Eq,Ord,Show)

https://github.com/dmjio/miso/blob/master/src/Miso/Router.hs

type Monomial coefficient exponent  = (coefficient, exponent)

最后从here开始,data Router a where RChoice :: Router a -> Router a -> Router a RCapture :: FromHttpApiData x => (x -> Router a) -> Router a RQueryParam :: (FromHttpApiData x, KnownSymbol sym) => Proxy sym -> (Maybe x -> Router a) -> Router a RQueryParams :: (FromHttpApiData x, KnownSymbol sym) => Proxy sym -> ([x] -> Router a) -> Router a RQueryFlag :: KnownSymbol sym => Proxy sym -> (Bool -> Router a) -> Router a RPath :: KnownSymbol sym => Proxy sym -> Router a -> Router a RPage :: a -> Router a MergeL sa sb a的选择方式,我看不到。

MergeR sa sb a

1 个答案:

答案 0 :(得分:7)

代数数据类型

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

  • data Universe a = Universe [a] a [a]

这定义了一个新的数据类型Universe,其中包含类型a(可以是任何类型)的数据,并且可以使用一个列表,一个元素和另一个列表进行构造。它并没有说太多,我无法提供一个有关何时使用它的示例,但是如果您有一个示例,我可以向您解释。 (编辑:看第一条评论)重要的是要注意,您可以使用它进行模式匹配,因此您可以使用以下功能:

    f :: Universe a        -> a
    f (Universe _ 0 _)      = 0
    f (Universe (x:xs) z ys = x
  • data BExpr = BoolConst Bool | Not BExpr | BBinary BBinOp BExpr BExpr | RBinary RBinOp AExpr AExpr

这再次定义了一种递归的新数据类型,它是最常用的类型。管道|的构造函数的意思是“或”,即您的BExpr类型可以是:

  • BoolConst Bool:以其他某种类型定义的布尔常量(真/假)
  • Not BExpr:另一个表达式的取反
  • 其他一些包含运算符和两个表达式的表达式

举个简单的例子,想想

Data Tree a = Leaf a | Node (Tree a) a (Tree a)

这是大多数树的定义方式:您的数据可以是Leaf,也可以是包含两棵树和一些数据的节点。

查看以下两个链接以获取更多信息: Haskell Wiki: Algebraic data type School of Haskell: Evaluating Data Types

  • data Digraph a = DG [a] [(a,a)] deriving (Eq,Ord,Show) 这与Universe a完全相同,它保存一些数据,并对其进行构造,从而为其提供一个[a]列表和一个元组(a,a)列表。同样,您可以使用模式匹配。

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