所以,我有一个名为
TotalDeleted
的类型,其中包含 amount 和 equivalent。
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)
这个错误是什么以及如何避免它?
你可能想写这样的东西:
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
之一,具体取决于您的目标。