主要观点:
- 在具有多态性和可变引用的不纯 ML 风格语言中,存在多态引用的可能性,可能导致不安全代码。
- Haskell 的 let 绑定没有值限制,但在类似示例的代码中,通过 monadic
do
绑定避免了多态引用的问题。 IO
是一个 monad,其内部结构特殊,防止了类似多态引用的情况,通过MonadGen
类来处理纯 monad 中的绑定泛化问题。- 对于
State
monad 可以实现MonadGen
实例,而对于IO
也可以通过将State# RealWorld
令牌装箱来实现MonadGen
。
关键信息:
- 不安全代码示例展示了多态引用可能导致的类型和内存安全问题。
- Haskell 中
IO
的类型定义及其内部工作原理,与状态 monad 相似。 MonadGen
类用于定义可以泛化绑定的 monad 类型类。
重要细节:
- 在没有针对多态引用的缓解措施的假设不纯语言中,特定代码会非常不安全。
- Haskell 中
IO
的do
绑定与纯let
绑定不同,其值传递给延续时具有特定类型。 Identity
monad 可以实现MonadGen
实例,通过generalize
函数实现。State
monad 也可以实现MonadGen
实例,通过特定的函数实现。IO
的内部结构使用State# RealWorld
作为能力和数据依赖,直接使用构造函数不安全,但通过装箱可以实现MonadGen
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。