【问题标题】:How fst on function that output tuples works in Haskell?输出元组的函数 fst 如何在 Haskell 中工作?
【发布时间】:2019-03-06 05:45:26
【问题描述】:

我试图弄清楚元组在 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)' 匹配

任何帮助或建议将不胜感激。提前致谢。

【问题讨论】:

  • Test 不能是函数的名称。函数名称以小写字母开头。
  • 哦,抱歉,我使用的是小写函数,为了举例,我只是将其更改为“测试”。

标签: haskell tuples


【解决方案1】:

你只是弄错了语法。

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)”。这显然不是你的意思。相反,您的意思是首先使用参数(1, c) 调用function,然后将结果作为参数传递给fst。为了表达这一点,您可以使用括号:

test c = fst (function (1, c))

当然,现在括号太多了。为了避免额外的一对,你可以使用无处不在的运算符$

test c = fst $ function (1, c)

这个运算符并没有真正做任何有趣的事情,它只是将左边的函数应用于右边的参数:

f $ x = f x

这个运算符的价值在于它可以让函数应用程序没有最高优先级,从而去掉多余的括号。

【讨论】:

  • 或者,(fst . function) (1, x)。虽然它确实有那一对额外的括号,这也是我也更喜欢$ 的解决方案的原因之一,但它确实避免了混乱的嵌套,并证明如果 OP 想要这样做,他们可以定义一个新函数作为fst . function。 (最后一句话是为什么function 不是函数的好名字的一个原因......)
  • 哦,它实际上并没有被称为函数,我只是为了示例而将其更改为函数。
  • 谢谢 Fyodor 和 Robin。 Fyodor,我最终将其更改为测试 c = fst d where d = function(1, c);我主要是想弄清楚为什么我的初始实现不起作用,你已经回答了。
  • 我的答案并不依赖于它被称为function。不管它叫什么,整个解释仍然成立。
  • 哦,抱歉,这条评论是给罗宾的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
相关资源
最近更新 更多