在函数中匹配时是否返回相同的Empty?

raa*_*m86 5 haskell pointers

我们有来自NICTA课程的mapOptional :

mapOptional :: (a -> b) -> Optional a -> Optional b
mapOptional _ Empty    = Empty
mapOptional f (Full a) = Full (f a)
Run Code Online (Sandbox Code Playgroud)

匹配时f我们显然使用传递的函数,那么Empty呢?那怎么样Full

Dan*_*ner 7

没有什么在Haskell,让你观察两者是否Emptys为同一 Empty或没有,没有什么实现必须在这方面的代码做担保.

也就是说,在GHC中,给定参数化类型的nullary构造函数在所有参数化中共享; 所以Empty在整个程序中只有一个[],只有一个,依此类推.

  • @DanielWagner你没错,你只是错过了细微差别.由于懒惰,产生相同的nullary值的两个暂停计算可以通过指向不同thunk的指针来表示.强制计算后,确实会共享结果值 (3认同)
  • @sjakobi很有魅力.答案已修复!我找出了旧答案的错误部分,强调这部分是错误的(我想强调它,因为我怀疑我可能不是唯一有这种错误信念的人!). (2认同)