【发布时间】:2021-06-18 00:29:38
【问题描述】:
我有这个代码
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
正如您在 sxOccurs 中看到的,我在 let 中有两个帮助函数,它们是“相互参照的”,因为我的 The Little MLer 称它们为:slOC 和seOC。因此,在 SML 中,您必须使用关键字and 让它们相互了解并相互“交叉引用”。顺便说一句,sxOccurs 计算 s 列表中特定 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
注意到命令域中的堆栈不断地改变堆栈,而 Haskell 正在为每个堆栈操作创建一个新的 si 变量。然后他说,这些行中的每一行都可以被打乱成不同的顺序,结果不会改变。 AFAICT 这与我的sxOccurs 的基本思想相同,因为它不关心我呈现子功能的顺序。那么,这又是指代透明性的更深层含义吗?如果不是,我在这里展示的是什么?
【问题讨论】:
-
“参照透明”的意思是“相同的输入产生相同的输出”。
-
那我上面说了什么?
-
第一个例子是“相互递归”,第二个我不确定它有没有专门的术语。
标签: haskell stateless referential-transparency