我试图弄清楚元组在Haskell中的工作方式,以及如何从元组中获取某些数据值。
我有以下代码,它可以正常运行,并打印出我期望的元组输出:
test :: Integer -> (Integer, Integer)
test c = function(1, c)
但是,当我尝试仅从元组中获取第一个值时,如下所示,
test :: Integer -> Integer
test c = fst function(1, c)
我收到以下错误
任何帮助或建议将不胜感激。预先感谢。
答案 0 :(得分:3)
您只是弄错了语法。
f x
的意思是“ 将(调用)函数f
应用于自变量x
”。
类似地,f x y
的意思是“将函数f
应用于参数x
和y
”。
您的示例function(1, c)
的意思是“ 将函数function
应用于参数(1, c)
”。在开头括号前不要让空格欺骗您:(1, c)
并不意味着“具有两个参数的调用函数”(例如C或Java) ,则表示“ 用两个成分1
和c
配对”。然后将此对用作function
的单个参数。
现在,下一个表达式fst function (1, c)
意味着“ 将函数fst
应用于两个自变量-function
和(1, c)
”。这显然不是您的意思。相反,您打算首先使用参数function
调用(1, c)
,然后将结果作为参数传递给fst
。为此,您可以使用括号:
test c = fst (function (1, c))
但是,现在当然括号太多了。为了避免多余的配对,您可以使用无处不在的运算符$
:
test c = fst $ function (1, c)
该运算符实际上并没有做任何有趣的事情,它只是将左侧的函数应用于右侧的参数:
f $ x = f x
此运算符的价值在于它使函数应用程序可能没有最高的优先级,从而消除了多余的括号。