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在定义的末尾加上一个。他试图解释为什么有必要,但我无法跟上他的思路。也许这里有人有我可以遵循的解释。我真的很感激。
您的朋友可能表示,在某些时候,您需要一个基本案例。鉴于定义
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)