递归数据类型的附加情况

fre*_*ist 2 recursion haskell types algebraic-data-types custom-data-type

我目前正在学习 Haskell,我想为货币定义我自己的递归数据类型Dollar(只是钞票,而不是硬币)。

我的尝试是这样的:

data Dollar = One Dollar
             | Two Dollar
             | Five Dollar
             | Ten Dollar
             | Twenty Dollar
             | Fifty Dollar
             | Hundred Dollar
Run Code Online (Sandbox Code Playgroud)

我向我的一个朋友展示了这个,他说它看起来不错,但他还告诉我| End在定义的末尾加上一个。他试图解释为什么有必要,但我无法跟上他的思路。也许这里有人有我可以遵循的解释。我真的很感激。

che*_*ner 7

您的朋友可能表示,在某些时候,您需要一个基本案例。鉴于定义

data Dollar = One Dollar
            | Two Dollar
            | Five Dollar
            | Ten Dollar
            | Twenty Dollar
            | Fifty Dollar
            | Hundred Dollar
            | End
Run Code Online (Sandbox Code Playgroud)

您可以将任意数量的钱表示为Dollar值的链接列表,每个值表示一张账单和“其余”的钱。End将终止列表。例如,

fortyTwoDollars :: Dollar
fortyTwoDollars = Twenty (Ten (Five (Five (Two End))))
Run Code Online (Sandbox Code Playgroud)

但是,我认为没有理由将列表混入其中;单个Dollar值可以单独代表一张账单,您可以使用一个[Dollar]值来表示一个集合。

data Dollar = One
            | Two
            | Five
            | Ten
            | Twenty
            | Fifty
            | Hundred
            
fortyTwoDollars :: [Dollar]
fortyTwoDollars = [Twenty, Ten, Five, Five, Two]
Run Code Online (Sandbox Code Playgroud)