为何GHCi中:i与:t显示Data.Random.sample的类型不一致?
GHCi中
:t与:i对Data.Random.sample类型报告不一致的原因 问题背景
在使用random-fu 0.3.0.0库时,查询Data.Random.sample的类型会出现两种不同的约束:
- 使用
:t命令得到的类型约束为Data.Random.Distribution d t:
ghci> :t Data.Random.sample Data.Random.sample :: (Data.Random.Distribution d t, Data.Random.StatefulGen g m, Control.Monad.Reader.Class.MonadReader g m) => d t -> m t
- 使用
:i命令得到的类型约束为Data.Random.Sampleable d m t:
ghci> :i Data.Random.sample Data.Random.sample :: (Data.Random.Sampleable d m t, Data.Random.StatefulGen g m, Control.Monad.Reader.Class.MonadReader g m) => d t -> m t -- Defined in `Data.Random.Sample'
查看源码可知,sample的实际定义依赖Sampleable约束,但存在一个标注为Distribution约束的注释版本。
原因解析
:i与:t的功能差异:i(:info)命令会显示函数的真实定义约束,也就是代码中实际编写的类型签名,所以展示的是底层的Sampleable d m t约束。:t(:type)命令会优先显示函数的Haddock注释签名——库作者为了给用户提供更简洁、易用的类型说明,在代码中给sample添加了带有Distribution d t约束的注释签名,这个签名是对用户友好的简化版本。
约束之间的逻辑关联
Distribution是一个更上层的抽象约束,库中已经定义了相关实例:只要类型满足Distribution d t,在符合StatefulGen g m和MonadReader g m的上下文下,会自动推导满足Sampleable d m t约束。因此,注释的签名对用户来说更直观,而Sampleable是内部实现细节,不需要用户直接关注。
内容的提问来源于stack exchange,提问作者Samuel Rivas
相关产品推荐
相关产品推荐

