是否有一个有用的居民为'forall v.Int - > v - > IO v`?

时间:2013-02-28 15:45:39

标签: haskell ghc

我们想说我们要编写一个由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

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

1 个答案:

答案 0 :(得分:8)

一般来说,IO可能会发生奇怪的事情,所以我认为没有涉及IO的严格的自由定理概念。无论如何,根据我对IO的了解,假设函数执行

  1. 什么都不会崩溃(比如做无意义的指针算法来产生v型的值),
  2. 不使用任何不安全的功能(通常会破坏任何类似自由定理的推理),
  3. 不返回底部(例如undefined或例外)和
  4. 最终“返回”
  5. 然后“返回”值将成为参数。

    但这意味着使用IO实现类型索引数据库

    可以使用Typeable a约束。在这种情况下,预期的自由定理不成立,并且允许get函数返回除默认值之外的其他内容。