从ByteString到Integer的可变哈希图。应该很容易但是可以理解为什么不进行类型检查。我应该手动注释一些类型吗?
import Control.Monad.ST ( ST, runST)
import qualified Data.HashTable.Class as HC
import Data.HashTable.Class ( HashTable )
import Data.ByteString.Lazy.Char8 ( ByteString )
fourSizedTable :: HashTable h => ST s (h s ByteString Integer)
fourSizedTable = HC.newSized 4
asList :: ST s [(ByteString, Integer)]
asList = fourSizedTable >>= HC.toList
失败并显示以下消息:
•(HashTable h0)没有实例
是由于使用“ fourSizedTable”而产生的
•在“(>> =)”的第一个参数中,即“ fourSizedTable”
在表达式中:fourSizedTable >> = HC.toList
在“ asList”的等式中:asList = fourSizedTable >> = HC.toList
答案 0 :(得分:5)
这里的问题是h
从您的asList
函数的签名中消失了,因此您不能再通过签名(或通过使用{{ 1}})。结果,Haskell不再知道要在这里选择帽子h
实例,因此会出错。
例如,您可以使用显式签名或扩展名asList
指定一个。例如:
HashTable
因此,我们在这里选择一个特定的TypeApplications
实例,因此不再存在混乱。