无法将预期类型“t2 Integer”与 getter 上的实际类型“Integer”匹配

问题描述 投票:0回答:1

所以,我有一个名为

TotalDeleted
的类型,其中包含 amountequivalent。 On 将值以整数形式存储在字符串中以进行打印(另外,我可以使用插入)。

以下代码如下所示:

data TotalDeleted = TotalDeleted {
    amount :: Integer,
    equivalent :: String
} deriving (Eq, Show, Data, Typeable)

amount' :: TotalDeleted -> Integer
amount' t = t.amount

amountTxt' :: TotalDeleted -> String
amountTxt' t = t.equivalent

在函数调用中调用 amount' 或 amountTxt' 时,给出以下类型错误:

_Couldn't match expected type ‘t2 Integer’ ... with actual type ‘Integer’

产生此错误的代码是:

main :: IO ()
main = do
    let mut = TotalDeleted 0 0
    let contents = getDirectoryContents =<< getCurrentDirectory
    result <- contents
        >>= traverse_ recursiveDeleteDirectory (amount' mut) (amountTxt' mut) <---------

    print (amount' mut)

这个错误是什么以及如何避免它?

haskell ghc
1个回答
0
投票

可能想写这样的东西:

traverse_ (recursiveDeleteDirectory (amount' mut) (amountTxt' mut))

额外的括号使

recursiveDeleteDirectory
成为
traverse_
的单个参数;相比之下,您当前的代码将三个参数传递给
traverse_
,即
recDelDir
amount' mut
amountTxt' mut
。我建议的修复假设
recursiveDeleteDirectory
具有
Integer -> String -> IO X
类型(对于某些类型
X
)(最有可能是
()
)。

如果确实是

recursiveDeleteDirectory
类型,我可以建议你改成
TotalDeleted -> IO X
吗?

另外:你将你的东西命名为

mut
,这让我认为你希望在遍历发生时更新其中的数字。这是不可能的——数据是不可变的,即使你给它一个表明它的名称。您可能应该考虑
StateT
IORef
之一,具体取决于您的目标。

© www.soinside.com 2019 - 2024. All rights reserved.