我在一个名为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个小时的答案,问题丢失了。想到也许我曾梦想过回答这些问题。很高兴知道我并不疯狂。
答案 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