我有两个这样的功能:
notice_objects_at::String -> IO()
notice_objects_at place = do
let (X,Y) = at place
putStrLn ("There is a" ++ show X ++ "," ++ show Y ++ "here.")
putStrLn "Hi"
at::String-> (String, String)
at place =
case place of
"bedroom" -> ("fly", "light switch")
"den" -> ("flyswatter", "light switch")
来自' at'函数我正在返回一个元组,我想将它存储到notice_objects_at函数中的两个变量X和Y.但是,我收到的错误是:
Not in scope: data constructor ‘X’
Not in scope: data constructor ‘Y’
Not in scope: data constructor ‘X’
Not in scope: data constructor ‘Y’
有什么问题?
答案 0 :(得分:2)
Haskell语法依赖于名称的大写。如上所述here:
任何以大写字母开头的东西都是具体类型 或数据构造函数。小写起始名称保留用于 函数名和变量,包括类型变量。
因此,当您将名称绑定到元组中的元素时:
let (X,Y) = at place
您需要小写名称:
let (x,y) = at place
(并在其他任何地方调整名称,当然!)
否则Haskell会将这些名称解释为数据构造函数,但当然无法在任何地方找到它们的定义,因此会出现错误消息。
另见Why does Haskell force data constructor's first letter to be upper case?