gpt4 book ai didi

Haskell -- 意外的预期类型

转载 作者:行者123 更新时间:2023-12-01 11:39:43 27 4
gpt4 key购买 nike

我正在尝试在 Haskell 中编写一个函数,它将弹出一些已序列化为字符串列表的项目。 (此列表表示文本文件的行——一行不一定是一项)

函数以另一个函数作为参数调用。此函数将弹出单个项目,并返回包含该项目和文本其余部分的元组。该函数应该递归地执行此操作 n 次,每次将结果添加到一个列表中。它返回此列表以及文本的其余部分,以用于进一步解析。

popN :: Integer -> [String] -> ([String]-> (a, [String])) -> ([a], [String])
popN n txt fun | n == 0 = ([], txt)
| n /= 0 = do
let (tp, newtxt) = fun txt
let newnum = n - 1
let (rest, after) = popN newnum newtxt fun
return (tp : rest, after)

当我尝试编译这段代码时,出现以下错误:

Couldn't match the expected type '[String]' with actual type '([a], [String])'
In the first argument of 'return', namely '(tp : rest, after)'

实际类型 ([a], [String]) 是我期望的类型。然而,我不明白的是为什么 [String] 是预期的类型。有人可以向我解释为什么 GHC 期望此函数返回 [String] 吗?

在此先感谢您的帮助。

最佳答案

return 接受一个 t 类型的值并产生一个 m t 类型的值,其中 m 是一些 monad .您的函数的结果是将 return 应用于参数的结果。那么,如果结果是 ([a], String) 类型,那么该参数必须具有哪种类型?好吧,return x 可以产生 ([a], String) 类型的值的唯一方法是如果 x 的类型为 [String]m 是类型构造函数 (,) [a] (没有考虑,在这一点上,大概不存在这样的实例在前奏中)。因此,类型检查器期望参数是 [String]

关于Haskell -- 意外的预期类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22572011/

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