对于类型`forall v.Int - > v - > IO v`,是否有一个有用的居民?

mni*_*ish 1 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
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*ner 8

一般来说,可能会发生奇怪的事情IO,所以我认为没有严格的自由定理概念IO.无论如何,从我所知道的IO实现,假设功能

  1. 什么都不会崩溃(比如做无意义的指针算法来产生v型的值),
  2. 不使用任何不安全的函数(通常会破坏任何类似自由定理的推理),
  3. 不要返回底部(例如undefined或例外)和
  4. 最终"回归"

然后"返回"值将是参数.

但是,这意味着它是不是可以用来实现一种类型的索引数据库IO.

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