无法从主模块调用Haskell函数

时间:2010-10-09 05:29:48

标签: haskell

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

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)

但是当我尝试用以下命令编译它时:

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

我收到此错误:

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)

如果我尝试在BinaryTree模块中导出数据类型,我会得到同样的错误:

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

我很茫然......我不知道自己做错了什么。建议,无论多么直接和明显都非常欢迎。谢谢。

更新

谢谢大家的帮助。

@Travis除了大家的建议之外,我在昨晚看到你的消息之前就这样做了:

import BinaryTree

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

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

更新2

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

3 个答案:

答案 0 :(得分:4)

要添加Jonno_FTW所说的内容,您需要在主模块中使用main例程它需要执行IO。所以你的Main.hs应该是这样的:

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

答案 1 :(得分:3)

您看到此错误是因为findPaths (Node Leaf Leaf)Main模块顶层的表达式,should only contain declarations

您可以通过尝试编译仅包含字符串文字的文件从GHC获得相同的错误,例如:

travis@sidmouth% echo '"Hello world"' > Test.hs
travis@sidmouth% 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会在这里给出与模板Haskell相关的错误消息 - 这是对一个简单错误的一个神秘而混乱的反应。您实际需要做的就是将表达式更改为声明。以下应该可以正常工作:

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

答案 2 :(得分:2)

我认为这里的问题在于你对ghc的调用,试试这个:

ghc -o main --make Main.hs