Haskell 为什么我的谓词被解释为布尔值?(哈斯克尔)
我试图在对列表上使用find函数,我想找到第一个元素等于x的对,所以我写了: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 == 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进行比较。这可以通过函数组合来完成。(==)
具有typex->x->Bool
。在您的情况下,typex
是(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)
之间绝对没有区别:两者的计算结果都是相同的函数值。