我们有来自NICTA课程的mapOptional:
mapOptional :: (a -> b) -> Optional a -> Optional b
mapOptional _ Empty = Empty
mapOptional f (Full a) = Full (f a)
匹配f
时,我们显然使用传递的函数,那么Empty
呢?那么Full
呢?
答案 0 :(得分:7)
Haskell中没有任何内容可以让您观察两个Empty
是否相同 Empty
,并且无法保证实现必须执行哪些操作这方面的代码。
也就是说,在GHC中,给定参数化类型的nullary构造函数在所有参数化中共享;所以整个程序中只有一个 Empty
,只有一个[]
,等等。
答案 1 :(得分:2)
它们不能是相同的Empty,参数的类型为Optional a
,输出的类型为Optional b
。当我试图强制某种重用时,我通常会使用类型
mapOptional _ a@Empty = a
这不会编译,我不认为这依赖于实现。