所以,我有一个名为TotalDeleted
的类型,它包含 amount 和 equivalent。On将值存储在一个字符串中,另一个存储在一个字符串中以供打印(我也可以使用intercalate)。
代码如下:
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'或amount txt'时,给出以下类型错误:_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)
What is this error and how to avoid it?
------------------------------------
Edit.
```hs
recursiveDeleteDirectory :: Integer -> String -> IO ()
1条答案
按热度按时间taor4pac1#
你可能想写这样的话:
额外的圆括号使
recursiveDeleteDirectory
的应用成为traverse_
的单个参数;相比之下,您当前的代码将三个参数传递给traverse_
,即recDelDir
、amount' mut
和amountTxt' mut
。我建议的修复假设recursiveDeleteDirectory
的类型为Integer -> String -> IO X
,而某些类型为X
(最有可能是()
)。如果这确实是
recursiveDeleteDirectory
的类型,我可以建议您将其改为TotalDeleted -> IO X
吗?还有:你把你的东西命名为
mut
,这让我觉得你希望在遍历发生时更新里面的数字。这是不可能的--数据是不可变的,即使您给予一个表明它的名称。您可能应该查看StateT
或IORef
中的一个,这取决于您的目标。