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

时间:2017-02-07 19:14:08

标签: pointers haskell

我们有来自NICTA课程的mapOptional:

mapOptional :: (a -> b) -> Optional a -> Optional b
mapOptional _ Empty    = Empty
mapOptional f (Full a) = Full (f a)

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

2 个答案:

答案 0 :(得分:7)

Haskell中没有任何内容可以让您观察两个Empty是否相同 Empty,并且无法保证实现必须执行哪些操作这方面的代码。

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

答案 1 :(得分:2)

它们不能是相同的Empty,参数的类型为Optional a,输出的类型为Optional b。当我试图强制某种重用时,我通常会使用类型

的东西
mapOptional _ a@Empty    = a

这不会编译,我不认为这依赖于实现。