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

时间:2014-11-08 10:30:07

标签: 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")

来自' 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’

有什么问题?

1 个答案:

答案 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?