如何调用haskell中另一个函数返回元组的函数?

问题描述:

我有两个功能,像这样的:如何调用haskell中另一个函数返回元组的函数?

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") 

的“为”功能,我返回一个元组,我想存储两个变量X和Y在notice_objects_at功能。但是,我收到的错误是:

Not in scope: data constructor ‘X’ 
Not in scope: data constructor ‘Y’ 
Not in scope: data constructor ‘X’ 
Not in scope: data constructor ‘Y’ 

什么问题?

+12

'x',而不是'X','y',而不是'Y'。只有类型和模块以大写字母开头。 – Zeta 2014-11-08 10:36:45

+1

我不认为这个问题应该作为印刷错误关闭。这是一个“小”的错误,但不是印刷:“X”是故意使用的,是一个真正的语言问题,不仅仅是键盘上的一些胖手指。 – amalloy 2014-11-08 13:02:39

+2

“只有类型和模块以大写字母开头”和数据构造函数,显然。 – 2014-11-08 13:16:35

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?