可变 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类型的区别是啥?

数据库 Oracle数据库对象一

Java1jdk安装/idea安装,关键字/数据类型/标识符,运算符,/包/类,if/switch,for/while,一维数组,家庭收支界面,/属性和方法,方法重载,变量分类,可变参数,包

物联网可变传输协议

软件构造课程提纲

SQL中nvarchar类型的默认长度是多少?