以下内容摘自 http://www.haskell.org 的一篇教程,考虑下面的定义:
data Tree a = Leaf a | Branch (Tree a) (Tree a)
fringe :: Tree a -> [a]
fringe (Leaf x) = [x]
fringe (Branch left right) = fringe left ++ fringe right
我不太清楚函数fringe执行时运行时会发生什么。
在编译表达式fringe left时,(1)编译器是否已经知道left树是Branch还是Leaf - 即它只操作静态已知的树 - 还是(2)它会发出一些if/switch条件来检查left树是一个Leaf还是Branch。
如果是后者即(2),那么为什么这比等效的C函数更类型安全,基本上看起来与上面的代码类似,除了只有一个类型浮动(指向节点的指针)。
fringe
将不得不为每个二叉树“形状”生成单独的版本。类型安全是编译时评估的不同概念。 - AlecLeaf "foo"
和Branch (Leaf "foo") (Leaf "bar")
都具有相同的类型,即Tree String
。请注意,此处的翻译保留了原始语句的含义和上下文,并尽力使之更加易于理解,但并未添加任何额外信息或解释。 - duplode