我有这个代码
data Slist a = Empty | Scons (Sexp a) (Slist a)
data Sexp a = AnAtom a | AnSlist (Slist a)
data Fruit = Peach | Apple | Pear | Lemon | Fig deriving (Show,Eq)
sxOccurs oatm sxp =
let slOC Empty = 0
slOC (Scons se sls) = (seOC se) + (slOC sls)
seOC (AnAtom atm) = if (atm == oatm) then 1 else 0
seOC (AnSlist sla) = slOC sla
in seOC sxp
正如您在我的 The Little MLersxOccurs
所说的那样,我在其中有两个帮助函数,let
它们是“相互引用的” :和. 所以在 SML 中,你必须使用关键字让他们相互了解并相互“交叉引用”。顺便说一句,计算 s 列表中特定对象的数量,在我的示例中,原子是变量。slOC
seOC
and
sxOccurs
AnAtom
Fruit
我的问题是,这是参考透明度的一个例子吗?同样,在戴维他举了这个例子
let s0 = emptyStack
s1 = push 12.2 s0
s2 = push 7.1 s1
s3 = push 6.7 s2
s4 = divStack s3
s5 = push 4.3 s4
s6 = subtStack s5
s7 = multStack s6
s8 = push 2.2 s7
s9 = addStack s8
in popStack s9
注意到 Imperative-land 中的堆栈不断地改变堆栈,而 Haskell 正在si
为每个堆栈操作创建一个新变量。然后他说,这些行中的每一行都可以被打乱成不同的顺序,结果不会改变。AFAICT 这与我的基本思想相同,因为sxOccurs
它不在乎我呈现子功能的顺序。那么,这又是指代透明性的更深层含义吗?如果不是,我在这里展示的是什么?