Haskell 为什么我的谓词被解释为布尔值?(哈斯克尔)

Haskell 为什么我的谓词被解释为布尔值?(哈斯克尔),haskell,compiler-errors,find,predicate,Haskell,Compiler Errors,Find,Predicate,我试图在对列表上使用find函数,我想找到第一个元素等于x的对,所以我写了: find (x == fst) list 由于fst函数缺少参数,我认为(x==fst)将是一个接受元组并返回布尔值的函数,但编译器将其解释为布尔值,就像fst是一个变量一样。也许fst被解释为一个函数?但这不要求它被()包围吗 我确实用列表理解解决了这个问题,但我仍然很好奇如何用find解决这个问题。(==)的类型是x->x->Bool。在您的情况下,键入x是(a,b)->a。这是因为它的一个操作数是具有该类型的f

我试图在对列表上使用find函数,我想找到第一个元素等于x的对,所以我写了:

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

我确实用列表理解解决了这个问题,但我仍然很好奇如何用find解决这个问题。

(==)
的类型是
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))。您可以将此函数用于程序,如下所示:
查找((x==).fst)列表

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

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

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

(==)比较两个函数x和fst,并返回Bool

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

(==)
具有type
x->x->Bool
。在您的情况下,type
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))。您可以将此函数用于程序,如下所示:
查找((x==).fst)列表

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

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

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

(==)比较两个函数x和fst,并返回Bool


取而代之的是一个函数,它接受一个元组,从元组中获取第一项,并将其与x进行比较。这可以通过函数组合来完成。

如果要将变量传递到特定位置,请使用lambda函数:

(\ y -> x == fst y)
否则,编译器不知道您希望在何处插入变量

如果你的函数调用一个函数,你可以使用currying来抄近路。但是对于复杂的表达式,这是行不通的。你不能只保留表达式中的最后一个项而期望它能起作用。它只适用于单个函数

另一种选择是使用函数
(x==)
和函数
fst
,并使用
(.)
操作符链接它们:

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

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

“更好”是个人喜好的问题。(没有性能差异;唯一的区别是源代码的外观。)

如果要将变量传递到特定位置,请使用lambda函数:

(\ y -> x == fst y)
否则,编译器不知道您希望在何处插入变量

如果你的函数调用一个函数,你可以使用currying来抄近路。但是对于复杂的表达式,这是行不通的。你不能只保留表达式中的最后一个项而期望它能起作用。它只适用于单个函数

另一种选择是使用函数
(x==)
和函数
fst
,并使用
(.)
操作符链接它们:

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

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

这是个人品味的问题,哪个“更好”。(没有性能差异;唯一的区别是源代码的外观。)

看起来像你想要的:
((x==).fst)
,其中
(x==)
是一个。事实上,
fst
是一个变量(即使我们经常称它为标识符),其值是一个类型为
(a,b)->a
的函数。Haskell中
fst
(fst)
之间绝对没有区别:两者都计算为相同的函数值。看起来您想要:
((x==).fst
,其中
(x==)
是a。实际上
fst
是一个变量(即使我们经常称之为标识符),其值是
(a,b)->a
类型的函数。Haskell中
fst
(fst)
之间绝对没有区别:两者的计算结果都是相同的函数值。