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
。如何理解?
答案 0 :(得分:7)
您的Parser定义实际上不是递归的。 =
符号的右侧是constructor。构造函数可以与其类型具有相同的名称,但这两个元素是不同的概念。
您可以在不丢失任何功能的情况下调用解析器构造函数:
data Parser a = Foo (String -> [(a, String)])
您的Tree
类型有两个构造函数,Leaf
和Node
。使其递归的是,Node
的定义递归地包括两个类型参数,两者都是Tree
。