2010-10-09 88 views
3

我在一个名为BinaryTree的Haskell模块中定义了一个名为findPaths的函数,我试图在创建的主模块中调用该函数。该类型的函数调用的是在主模块中调用Haskell函数时遇到问题

findPaths :: Tree -> [Path] 

哪里Tree是被定义为一种数据类型:

data Tree = Leaf | Node Tree Tree

Path被定义为:

data Path = LeftTurn Path | RightTurn Path | This 

在主函数中,我这样做,只有这样:

module Main where 
import BinaryTree 
findPaths (Node Leaf Leaf) 

但是,当我尝试用下面的命令编译:如果我尝试导出的数据类型在

Couldn't match expected type `Language.Haskell.TH.Syntax.Q 
            [Language.Haskell.TH.Syntax.Dec]' 
against inferred type `[Path]' 
In the expression: findPaths (Node Leaf Leaf)

我得到了同样的错误:

ghc -o --make Main Main.hs BinaryTree.hs

我得到这个错误BinaryTree模块:

module BinaryTree (Tree(..), Path(..), allPaths) where... 

我很茫然......我不知道我做错了什么。建议,不管前进多么明显,都非常受欢迎。谢谢。

UPDATE

谢谢大家,你们的帮助。从

@Travis除了每个人都建议我结束之前我看了你的消息,这样做昨晚:

import BinaryTree 

main = do 
    print (findPaths (Node Leaf Leaf)) 

它的工作原理我预期的方式。但在将来,我会确保遵循您引用我的正确语义。

更新2

我昨晚回应与其他一些答案,但显然有值得答案和问题的power outage和4小时丢失了。想到也许我曾梦想着回答这些问题。很高兴知道我不疯狂。

+1

2.是的,如果你使用'putStrLn'因为'putStrLn'需要一个字符串和树是不是一个字符串的'show'是必要的。您可以使用'show'将树转换为字符串。你导出'Show'的原因是,你的Tree类型甚至有一个'show'函数。如果你没有派生(或手动实例化)'Show',你就不能调用'show'。 – sepp2k 2010-10-09 09:14:22

回答

3

你会看到这个错误,因为findPaths (Node Leaf Leaf)为您Main模块,should only contain declarations的顶层的表达式。

您可以尝试编译只包含一个字符串的文件,例如得到GHC了同样的错误:

[email protected]% echo '"Hello world"' > Test.hs 
[email protected]% ghc Test.hs 

Test.hs:1:0: 
    Couldn't match expected type `Language.Haskell.TH.Syntax.Q 
            [Language.Haskell.TH.Syntax.Dec]' 
      against inferred type `[Char]' 
    In the expression: "Hello world" 

我不知道为什么GHC给相关模板哈斯克尔这里 - 一个错误信息对一个简单的错误来说,这是一个神秘和混乱的回应。你实际需要做的就是将表达式改为声明。以下应该只是罚款:

module Main where 
import BinaryTree 
paths = findPaths (Node Leaf Leaf) 
main = putStrLn "Do something here." 
+2

GHC隐式拼接模板哈斯克尔声明在最高水平的6.12.1版本:如果'decls'是类型'Q [月]的值为'你可以只写'decls'而不是'$(decls)传统的语法'。这个工程即使没有启用TemplateHaskell语言扩展:一个错误,这似乎是固定GH​​C 7:http://hackage.haskell.org/trac/ghc/ticket/4042 – 2010-10-10 15:35:59

2

我觉得这里的问题是你的GHC的电话,试试这个:

ghc -o main --make Main.hs 
4

要添加到什么Jonno_FTW说,你需要一个main常规的主模块,它需要做的IO在。所以,你应该Main.hs是这样的:

module Main where 
import BinaryTree 
main = putStrLn . show . findPaths $ Node Leaf Leaf 
+0

这是正确的,问题提问者似乎认为裸功能的主模块调用将被调用,以... – yatima2975 2010-10-09 07:19:56

+0

我实际上做了,因为我做的东西有点类似之前,所以我估计它会工作。但在那个代码现在看,我看到,我有一个线,然后'主要= putStrLn的“HelloWorld”''插入5(节点1叶叶)''那里是insert'在另一个模块中定义。 – 2010-10-09 07:34:50

+0

'putStrLn。 show'与'print'是一样的btw。 – sepp2k 2010-10-09 09:12:00