如何调用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’
什么问题?
答
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?
'x',而不是'X','y',而不是'Y'。只有类型和模块以大写字母开头。 – Zeta 2014-11-08 10:36:45
我不认为这个问题应该作为印刷错误关闭。这是一个“小”的错误,但不是印刷:“X”是故意使用的,是一个真正的语言问题,不仅仅是键盘上的一些胖手指。 – amalloy 2014-11-08 13:02:39
“只有类型和模块以大写字母开头”和数据构造函数,显然。 – 2014-11-08 13:16:35