输出元组的函数在Haskell中如何工作?

时间:2019-03-06 05:45:26

标签: haskell tuples

我试图弄清楚元组在Haskell中的工作方式,以及如何从元组中获取某些数据值。

我有以下代码,它可以正常运行,并打印出我期望的元组输出:

test :: Integer -> (Integer, Integer)
test c =  function(1, c)

但是,当我尝试仅从元组中获取第一个值时,如下所示,

test :: Integer -> Integer
test c = fst function(1, c)

我收到以下错误

  • 无法将预期类型'(((Integer,Integer)-> Integer,b0)')与实际类型'(Integer,Integer)->(Integer,Integer)'

任何帮助或建议将不胜感激。预先感谢。

1 个答案:

答案 0 :(得分:3)

您只是弄错了语法。

f x的意思是“ 将(调用)函数f应用于自变量x ”。

类似地,f x y的意思是“将函数f应用于参数xy”。

您的示例function(1, c)的意思是“ 将函数function应用于参数(1, c) ”。在开头括号前不要让空格欺骗您:(1, c)并不意味着“具有两个参数的调用函数”(例如C或Java) ,则表示“ 用两个成分1c 配对”。然后将此对用作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

此运算符的价值在于它使函数应用程序可能没有最高的优先级,从而消除了多余的括号。