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

こんにちは、上記の定義を考えてみましょう: 私の目には、無限の定義 - 再帰的な定義です。たとえば、私は、ツリーを定義したような(再帰的な、無限の構造):newtypeと再帰的定義

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

そしてTreeはinifiniteことができるが、我々はLeafを持っており、それが再帰的定義を「終える」ことができます。

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

(ちょうどhttps://wiki.haskell.org/Newtypeによるnewtype-置き換える) そしてそれは、再帰的な定義であるとLeafようには「有限要素」がない。だから、dataに私の最初の定義を翻訳してみましょう。それを理解する方法?

+5

再帰はどこですか? (データ)コンストラクタ "Parser"を持つ型(コンストラクタ) "Parser"を定義します。定義された型は右側にはありません。 – d8d0d65b3f7cf42

+0

'データツリーa =リーフ|ノード(ツリーa)(ツリーa).'ここで再帰はありますか? – Gilgamesz

+0

また、意味的には、 'newtype'と' data'の間に違いはありませんので、あなたは本当に別のことをしていません。 – Emil

答えて

7

あなたのパーサの定義は実際には再帰的ではありません。 =の右側にある記号はconstructorです。コンストラクターは型と同じ名前を持つことができますが、2つのことは別個の概念です。

あなたは、任意の機能を失うことなく、何か他のパーサーのコンストラクタを呼び出すことができます。あなたのTreeタイプは2つのコンストラクタ、LeafNodeを持って

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

。再帰的にすることは、Nodeの定義に再帰的に2つの型パラメータが含まれており、どちらもTreeです。