为什么这不键入检查?

时间:2019-08-22 19:41:10

标签: haskell

从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

1 个答案:

答案 0 :(得分:5)

这里的问题是h从您的asList函数的签名中消失了,因此您不能再通过签名(或通过使用{{ 1}})。结果,Haskell不再知道要在这里选择帽子h实例,因此会出错。

例如,您可以使用显式签名或扩展名asList指定一个。例如:

HashTable

因此,我们在这里选择一个特定的TypeApplications实例,因此不再存在混乱。