1

假设我们要编写一个由 IO 操作支持的通用属性映射,但由于某种原因,我们需要使值类型具有多态性。

type Key = Int
get:: Key -> v -> IO v -- Takes a key and a default value, return the associated value
put:: Key -> v -> IO () -- store (Key,v) pair doing some IO

自由定理是否要求这样做get并且put在这种情况下也只做一些琐碎的事情,如果是这样,我们可以欺骗 ghc 的类型系统来实现一个真正的类型索引 IO 数据库吗?

4

1 回答 1

8

通常,奇怪的事情可能发生在 中IO,所以我认为没有涉及 的自由定理的严格概念IO。无论如何,从我所知道IO的实现它,假设功能做

  1. 没有什么东西会崩溃(比如做无意义的指针运算来产生一个类型为 v 的值),
  2. 不使用任何不安全的函数(通常会破坏任何类似自由定理的推理),
  3. 不要返回底部(例如undefined或异常)和
  4. 最终“回归”</li>

那么“返回”值将是参数。

但这意味着不可能使用IO.

Typeable a约束是可能的。在这种情况下,预期的自由定理不成立,并且get函数将被允许返回默认值以外的其他值。

于 2013-02-28T15:57:15.567 回答