相关疑难解决方法(0)

StableNames比reallyUnsafePtrEquality#有什么优势,反之亦然?

数据稳定名称 a

稳定名称具有以下属性:如果sn1 :: StableName和sn2 :: StableName和sn1 == sn2,则通过在同一对象上调用makeStableName创建sn1和sn2.

反过来不一定如此:如果两个稳定名称不相等,那么它们命名的对象可能仍然相等.

reallyUnsafePtrEquality# :: a - > a - > Int#

reallyUnsafePtrEquality#返回GHC堆上的两个对象是否是同一个对象.它真的不安全,因为垃圾收集器会移动东西,闭包等.据我所知,它可以返回假阴性(它说两个对象不一样,但它们都是),但不是误报(说它们当他们不是时,他们会一样.

他们两个似乎做了同样的基本事情:他们可以告诉你两个对象是否绝对相同,但不是它们是否绝对不是.

我能看到的StableNames的优点是:

  • 他们可以散列.
  • 他们不那么不便携.
  • 他们的行为得到了很好的定义和支持.
  • 他们没有真正的不安全作为他们名字的一部分.

我可以在reallyUnsafePtrEquality#中看到的优点:

  • 它可以直接在有问题的对象上调用,而不必创建单独的StablesNames.
  • 您不必通过IO函数来创建StableNames.
  • 您不必保留StableNames,因此内存使用率较低.
  • RTS不需要做任何使StableNames工作的魔法,因此性能可能更好.
  • 它的名字真的很不安全,最后是#.铁杆!

我的问题是:

  • 我错过了什么吗?

  • 是否有任何用例,StableNames与他们命名的对象分开是有利的?

  • 是否比另一个更准确(不太可能返回假阴性)?

  • 如果你不需要散列,不关心可移植性,并且不会被使用名为reallyUnsafe的东西所困扰,是否有理由更喜欢StableNames而不是reallyUnsafePtrEquality#?

haskell ghc

13
推荐指数
1
解决办法
996
查看次数

是否有可能在Haskell中检测共享?

在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 functional-programming

11
推荐指数
2
解决办法
530
查看次数

Haskell函数检查两个值是否相同

在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是否与我回来的相同 - …

haskell

1
推荐指数
1
解决办法
1053
查看次数

GHC在调用Eq之前是否比较指针?

从2014 年开始在邮件列表上的这个条目似乎表明答案是否定的.如果它仍然没有,我怎么能快速比较两个巨大的数据结构,其中一个是另一个的完全匹配,或稍微改变的版本?

comparison haskell

1
推荐指数
1
解决办法
124
查看次数

标签 统计

haskell ×4

comparison ×1

functional-programming ×1

ghc ×1