我正在尝试在成对的列表上使用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比较的函数。这可以通过功能组合来完成。