【问题标题】:Why this doesn't type checks?为什么这不键入检查?
【发布时间】:2019-08-22 19:41:10
【问题描述】:

从 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

【问题讨论】:

  • 我认为这里的问题是 h 已从类型签名中“删除”,因此现在您有了一个不再清楚您实际使用的 hastable 的函数。跨度>
  • 类型错误应该还包含了h0类型不明确的声明,这是一个重要的线索。

标签: haskell


【解决方案1】:

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

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

{-# LANGUAGE TypeApplications #-}

import           Control.Monad.ST               ( ST, runST)
import qualified Data.HashTable.ST.Basic       as HT
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 @HT.HashTable >>= HC.toList

因此,我们在这里选择了一个特定的HashTable 实例,因此不再有混淆。

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2017-07-11
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多