newtype和递归定义

Gil*_*esz 0 recursion haskell

newtype Parser a = Parser (String -> [(a,String)])
Run Code Online (Sandbox Code Playgroud)

嗨,让我们考虑一下上面的定义:在我看来,它是无限定义 - 递归定义.例如,我定义了树(递归,无限结构),如:

data Tree a = Leaf | Node (Tree a) (Tree a).
Run Code Online (Sandbox Code Playgroud)

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

data Parser a = Parser (String -> [(a,String)])
Run Code Online (Sandbox Code Playgroud)

它是递归定义,没有"有限元"之类的Leaf.怎么理解呢?

Cha*_*ert 7

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

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

data Parser a = Foo (String -> [(a, String)])
Run Code Online (Sandbox Code Playgroud)

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