可变 Hastable : 非法类型同义词家庭应用实例
Posted
技术标签:
【中文标题】可变 Hastable : 非法类型同义词家庭应用实例【英文标题】:Mutable Hastable : Illegal type synonym family application in instance 【发布时间】:2021-06-24 20:07:18 【问题描述】:我正在尝试使用这个库中的 Mutable BasicHashTable:https://github.com/gregorycollins/hashtables
-# LANGUAGE GeneralizedNewtypeDeriving #-
import qualified Data.HashTable.IO as H
import Control.Monad.State.Strict
import Control.Monad.IO.Class (MonadIO)
type A = H.BasicHashTable Int String
newtype MyWrapper a = MyWrapper runM :: StateT A IO a
deriving (Functor, Applicative, Monad, MonadIO, MonadState A )
编译器抱怨我尝试在类型类实例中使用A
:
error:
• Illegal type synonym family application ‘Control.Monad.Primitive.PrimState
IO’ in instance:
MonadState A MyWrapper
• In the newtype declaration for ‘MyWrapper’
|
10 | deriving (Functor, Applicative, Monad, MonadIO, MonadState A )
| ^^^^^^^^^^^^
【问题讨论】:
正在查看:***.com/questions/45360959/… 我认为 PrimState 对类型系列感到震惊:试试这个: import qualified Data.HashTable.ST.Basic as B type A = B.HashTable Int String RealWorld 【参考方案1】:我觉得这很奇怪,因为PrimState
是一个类型家族。试试这个:
import Control.Monad.ST (RealWorld)
import qualified Data.HashTable.ST.Basic as B
type A = B.HashTable Int String RealWorld
你得到的编译错误告诉我们它不能处理类型族。如果您查看哈希表类型的定义,您会发现它抱怨的 PrimState
用法:
import qualified Data.HashTable.ST.Basic as B
type BasicHashTable k v = IOHashTable (B.HashTable) k v
type IOHashTable tabletype k v = tabletype (PrimState IO) k v
所以你可以自己直接使用,because:
type instance PrimState IO = RealWorld
事实上。我什至会向上游提交带有修复的 PR:
- type IOHashTable tabletype k v = tabletype (PrimState IO) k v
+ type IOHashTable tabletype k v = tabletype RealWorld k v
因为没有充分的理由以现在的方式定义它
【讨论】:
以上是关于可变 Hastable : 非法类型同义词家庭应用实例的主要内容,如果未能解决你的问题,请参考以下文章
SQLSERVER中nvarchar和varchar类型的区别是啥?
Java1jdk安装/idea安装,关键字/数据类型/标识符,运算符,/包/类,if/switch,for/while,一维数组,家庭收支界面,/属性和方法,方法重载,变量分类,可变参数,包