假设我们想要编写一个由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数据库吗?
一般来说,可能会发生奇怪的事情IO,所以我认为没有严格的自由定理概念IO.无论如何,从我所知道的IO实现,假设功能
undefined或例外)和然后"返回"值将是参数.
但是,这意味着它是不是可以用来实现一种类型的索引数据库IO.
可以通过Typeable a约束来实现.在这种情况下,预期的自由定理不成立,并且get允许函数返回除默认值之外的其他内容.