我正在尝试在成对的列表上使用find函数,并且想找到第一个元素等于x的第一对,所以我这样写道:

find (x == fst) list

由于fst函数缺少参数,我认为(x == fst)将是一个接收元组并返回 bool(boolean) 值的函数,但是编译器将其解释为 bool(boolean) 值,就好像fst是变量一样。也许fst被解释为一个函数?但这不是要求它必须被()包围吗?

我确实使用列表推导来解决问题,但是我仍然很好奇如何使用查找来解决问题。

最佳答案

(==)的类型为x -> x -> Bool。在您的情况下,键入x(a, b) -> a。这是因为它的操作数之一是fst,它具有该类型。因此,您的情况下(==)的类型为((a, b) -> a) -> ((a, b) -> a) -> Bool。也就是说,(==)是一个比较x和fst两个函数的函数。

您想要的是组成fst(==)。例如,(\y -> (x == fst y)。这个函数接受一个元组y,并检查x是否等于其第一个值。

有一个函数可以为您组成函数(.)。它具有两个函数f(x)和g(x),并返回另一个函数f(g(x))。您可以像下面这样在程序中使用此函数:find ((x ==) . fst) list

比较以下程序,第一个程序编写为lambda函数,第二个程序与函数组合运算符:

(\y -> (x == fst y)

-- Compared to:
       (x ==) . fst

概要:

(==)正在比较两个函数x和fst,并返回一个 bool(boolean) 值。

相反,您需要的是一个接收元组,从中获取第一项并将其与x比较的函数。这可以通过功能组合来完成。

10-06 02:44