我正在开发一个小程序,但我遇到了错误。
我有一个解析的xml文件,我通过函数获取了我想要的信息。结构看起来像这样:
takeall :: [Element] -> (String,String,(String,String),(String,String))
工作正常。接下来我还有一些功能,基本上可以创建一个带坐标的虚拟板。如果它是空的,它将只返回字符串中的空格,如果不是它将返回我在那里没有第一对字符串的信息。那对代表坐标,我不再需要了
所以这个函数看起来像这样:
vboard :: [Element] -> [[(String,String, (String,String))]]
如果我打印出来,这很好。
现在这是它变得混乱的部分。我想根据vboard结果制作一个新的主板。所以我有两个功能。第一个是变换
transform :: (String,String,(String,String)) -> [String]
transform (p,o,(pl,ml)) | (p,o,(pl,ml)) == ("A","N",("","")) = ["aaa","aaa","aaa"]
transform (p,o,(pl,ml)) | (p,o,(pl,ml)) == ("B","N",("","")) = ["bbb","bbb","bbb"]
transform (p,o,(pl,ml)) | (p,o,(pl,ml)) == ("C","N",("","")) = ["ccc","ccc","ccc"]
正如您所看到的,这仅适用于单个元素。要使用它我实现另一个功能。
final :: [[(String,String,(String,String))]] -> [[[String]]]
final l = map (map (transform)) l
好的,如果我有一个这样的vboard“结果”,一个有两行的电路板看起来像这样吗?
[[("A","N",("","")),("A","N",("",""))],
[("B","N",("","")),("C","N",("",""))]]
然后,如果我将最终函数应用于此结果,我希望结果为
[[["aaa","aaa","aaa"],["aaa","aaa","aaa"]]
[["bbb","bbb","bbb"],["ccc","ccc","ccc"]]]
但是当我在ghci中运行它时会给我一个错误
Invalid type signature final [[(String,String,(String,String))]] -> [[[String]]]
Should be of form <variable> :: <type>
我是haskell的新手(英语不是我的第一语言,所以我不懂一些技术性的东西),所以你能解释这个错误意味着什么,我应该如何解决它?
此致
编辑:您可以查看此处的完整代码
它在功能上有不同的名称,但你可以很容易地发现它们。
答案 0 :(得分:1)
这是问题 -
drawfinal2 l :: [[Funky]] -> [[[String]]]
你在定义中有一个额外的l。如果你删除它,问题就会消失。
答案 1 :(得分:0)
为了调试这些类型的问题,我尝试注释掉有问题的类型声明(在你的情况下final :: [[...
并用-Wall编译以查看GHC自己推断的类型 - 如果它完全编译。
GHC为您提供了类型推理的绝佳工具,值得使用。