gpt4 book ai didi

haskell - 为什么这不进行类型检查?

转载 作者:行者123 更新时间:2023-12-02 10:04:25 24 4
gpt4 key购买 nike

从 ByteString 到 Integer 的可变 HashMap 。应该很容易,但可以理解为什么它不进行类型检查。我应该手动标注某种类型吗?

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

失败并显示以下消息:

• No instance for (HashTable h0)
arising from a use of ‘fourSizedTable’
• In the first argument of ‘(>>=)’, namely ‘fourSizedTable’
In the expression: fourSizedTable >>= HC.toList
In an equation for ‘asList’: asList = fourSizedTable >>= HC.toList

最佳答案

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

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

{-# LANGUAGE <b>TypeApplications</b> #-}

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

因此,我们在这里选择一个特定的 HashTable 实例,因此不再存在困惑。

关于haskell - 为什么这不进行类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57616104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com