我正在查看一些示例,以了解更复杂的'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
答案 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)
列表。同样,您可以使用模式匹配。对于最后一个,同样,它们是调用该类型的构造函数的不同方法