Haskell:应该是<variable> :: <type> </type> </variable>

时间:2013-12-18 21:26:39

标签: xml haskell

我正在开发一个小程序,但我遇到了错误。

我有一个解析的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的新手(英语不是我的第一语言,所以我不懂一些技术性的东西),所以你能解释这个错误意味着什么,我应该如何解决它?

此致

编辑:您可以查看此处的完整代码

http://paste2.org/pms66kdm

它在功能上有不同的名称,但你可以很容易地发现它们。

2 个答案:

答案 0 :(得分:1)

这是问题 -

drawfinal2 l :: [[Funky]] -> [[[String]]]

你在定义中有一个额外的l。如果你删除它,问题就会消失。

答案 1 :(得分:0)

为了调试这些类型的问题,我尝试注释掉有问题的类型声明(在你的情况下final :: [[...并用-Wall编译以查看GHC自己推断的类型 - 如果它完全编译。

GHC为您提供了类型推理的绝佳工具,值得使用。