newtype和递归定义

时间:2016-04-18 16:55:31

标签: haskell recursion

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

嗨,我们考虑以上定义: 在我看来,它是无限定义 - 递归定义。例如,我定义了树(递归,无限结构),如:

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

并且Tree可以是无限的但我们有Leaf并且它可以"完成"递归定义。所以,让我们将我的第一个定义翻译为data: (只需根据https://wiki.haskell.org/Newtype替换newtype-)

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

它是递归定义,并且没有"有限元素"比如Leaf。如何理解?

1 个答案:

答案 0 :(得分:7)

您的Parser定义实际上不是递归的。 =符号的右侧是constructor。构造函数可以与其类型具有相同的名称,但这两个元素是不同的概念。

您可以在不丢失任何功能的情况下调用解析器构造函数:

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

您的Tree类型有两个构造函数,LeafNode。使其递归的是,Node的定义递归地包括两个类型参数,两者都是Tree