(==)
имеет тип 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
.
Сравните следующие программы: первая написана как лямбда-функция, вторая - с оператором композиции функции:
(\y -> (x == fst y)
-- Compared to:
(x ==) . fst
Резюме:
(==) сравнивает две функции, x и fst, и возвращает Bool.
Вместо этого вам нужна функция, которая принимает кортеж, получает из него первый элемент и сравнивает его с x. Это можно сделать с помощью функции композиции.