haskell 无法在getter上将预期类型“t2 "与实际类型”t2“匹配

0s0u357o  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(75)

所以,我有一个名为TotalDeleted的类型,它包含 amountequivalent。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 ()
taor4pac

taor4pac1#

你可能想写这样的话:

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

额外的圆括号使recursiveDeleteDirectory的应用成为traverse_的单个参数;相比之下,您当前的代码将三个参数传递给traverse_,即recDelDiramount' mutamountTxt' mut。我建议的修复假设recursiveDeleteDirectory的类型为Integer -> String -> IO X,而某些类型为X(最有可能是())。
如果这确实是recursiveDeleteDirectory的类型,我可以建议您将其改为TotalDeleted -> IO X吗?
还有:你把你的东西命名为mut,这让我觉得你希望在遍历发生时更新里面的数字。这是不可能的--数据是不可变的,即使您给予一个表明它的名称。您可能应该查看StateTIORef中的一个,这取决于您的目标。

相关问题