haskell - 为什么我的谓词被解释为 bool 值? ( haskell )

标签 haskell compiler-errors find predicate

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

关于haskell - 为什么我的谓词被解释为 bool 值? ( haskell ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50056998/

相关文章:

haskell - Haskell 中以下函数最通用的类​​型

java - 将类 Java 2D 动态规划矩阵转换为 Haskell

java - java noob : error:cannot find symbol [duplicate]

linux - 获取按时间排序的文件名

linux - 如何查找多行内容的文件?

haskell - 将 Haskell 函数转换为 SML

haskell - 在 Emacs Lisp 中使用 foldr 实现 map

c++ - 错误: request for member 'clear' in 'graph' , which is of non-class type

c# - 创建编译错误而不是运行时错误

c++ - 在不包含在另一个范围内的范围内找到第一个元素