难道不知道两个函数是否相同吗?例如,编译器编写者想要确定开发人员编写的两个函数是否执行相同的操作,可以使用哪些方法来确定那个函数?或者我们可以做些什么来找出两个TM是相同的?有没有办法规范机器?
编辑:如果一般情况是不可判定的,在正确地说两个函数是等价的之前,您需要多少信息?
我有一个获取数据的函数,并返回相同的数据或稍微修改过的版本.
我希望让我的程序做一件事,如果它改变了或另一件事,如果它没有改变.
以前我回来了一对(Bool,Object)并用fst它来检查它是否改变了.最近,我想到我可以通过返回对象并使用检查相等来简化代码==.
但后来我意识到Haskell没有区分深度相等检查和"对象身份"(即指针相等).那么我怎么知道使用是否==有效?我是否应该出于效率原因而避免使用它,或者是否存在依赖于编译器确定它不需要进行深度相等检查的情况?
通常我在编写初始程序时不会太担心效率,但这会影响我的模块的接口,所以我想在编写太多代码之前做到正确,并且似乎不值得让程序更多仅仅是一小段代码效率较低.此外,我想更好地了解我可以依靠GHC进行哪种优化来帮助我.
在Scheme中,原语eq?测试其参数是否是同一个对象.例如,在以下列表中
(define lst
(let (x (list 'a 'b))
(cons x x)))
Run Code Online (Sandbox Code Playgroud)
的结果
(eq? (car x) (cdr x))
Run Code Online (Sandbox Code Playgroud)
是真实的,而且它是真实的,而不具有窥视(car x)和(cdr x).这允许您为具有大量共享的数据结构编写有效的相等性测试.
在Haskell中是否可以做同样的事情?例如,请考虑以下二叉树实现
data Tree a = Tip | Bin a (Tree a) (Tree a)
left (Bin _ l _) = l
right (Bin _ _ r) = r
mkTree n :: Int -> Tree Int
mkTree 0 = Tip
mkTree n = let t = mkTree (n-1) in Bin n t t
Run Code Online (Sandbox Code Playgroud)
在每个级别都有共享.如果我创建一棵树 …
在Haskell中,我们有一个函数(==) :: Eq a => a->a->Bool,它适用于Eq可以定义实例的大量数据类型.但是,有些类型没有合理的方法来定义实例Eq.一个例子是简单的函数类型(a->b)
我正在寻找一个函数,告诉我两个值是否实际相同 - 不相等但相同.
例如f(id,id)==> True f((+),(-))= False
澄清:
我并不想知道如果两个函数做同样的事情.在一般情况下,这是不可能的.我想知道我是否已经回到了与我开始时相同的事情.让我举一个精简的例子:
data Foo = Foo (Foo->Foo) --contains a function so no Eq instance
x :: Foo
x = Foo id -- or for that matter Foo undefined
y :: Foo
y = Foo (const x)
a :: Foo
a = let (Foo fy) = y
in fy x
Run Code Online (Sandbox Code Playgroud)
很明显,通过检查一旦评估,a将是x.但是我们假设我不知道y中的函数但我想测试我放入的Foo是否与我回来的相同 - …