2016-04-18 55 views
0
newtype Parser a = Parser (String -> [(a,String)]) 

嗨,让我们考虑以上定义: 在我的眼睛,它是无限定义递归定义。比如我定义树(递归的,无限的结构),如:新类型和递归定义

data Tree a = Leaf | Node (Tree a) (Tree a). 

而且Tree可以inifinite但我们有Leaf,它可以“完成”递归定义。所以,让我们我的第一个定义,翻译成data: (只需更换newtype-根据https://wiki.haskell.org/Newtype

data Parser a = Parser (String -> [(a,String)]) 

它是递归定义,也没有“有限元”之类Leaf。如何理解它?

+5

哪里是递归?您可以使用(数据)构造函数“Parser”定义一个类型(构造函数)“Parser”。定义的类型不会出现在右侧。 – d8d0d65b3f7cf42

+0

'数据树a = Leaf |节点(树a)(树a)。这里有递归吗? – Gilgamesz

+0

另外,在语义上,'newtype'和'data'没有区别,所以你没有真正做过任何不同的事情。 – Emil

回答

7

您的解析器定义实际上并不是递归的。 =符号的右侧是constructor。构造函数可以与它们的类型具有相同的名称,但是这两个东西是不同的概念。

你可以调用解析器构造别的东西,而不会丢失任何功能:

data Parser a = Foo (String -> [(a, String)]) 

Tree类型有两个构造,LeafNode。使其递归的事情是Node的递归定义包括两个类型参数,它们都是Tree