Почему мой предикат интерпретируется как логическое значение? (Haskell) - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь использовать функцию поиска в списке пар, и я хочу найти первую пару, в которой первый элемент равен x, поэтому я написал:

find (x == fst) list

Поскольку функции fst не хватает аргумента, я думал, что (x == fst) будет функцией, которая принимает кортеж и возвращает логическое значение, но компилятор интерпретирует его как логическое значение, как если бы fst была переменной. Может быть, fst интерпретируется как функция? Но разве это не требует, чтобы он был окружен ()?

Вместо этого я решил проблему, используя понимание списка, но мне все еще интересно, как можно решить эту проблему, используя find.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Если вы хотите передать переменную в определенную позицию, используйте лямбда-функцию:

(\ y -> x == fst y)

В противном случае компилятор не знает точно, где вы собираетесь вставить переменную.

Если ваша функция вызывает одну функцию , вы можете использовать карри для кратчайшего пути. Но для сложных выражений это не работает. Вы не можете просто оставить последний член в выражении и ожидать, что он сработает. Это работает только для одной функции .

Другая альтернатива - взять функцию (x ==) и функцию fst и связать их с помощью оператора (.):

((x ==) . fst)

Это вопрос личного вкуса, который "лучше". (Разницы в производительности нет; разница только в том, как выглядит ваш исходный код.)

0 голосов
/ 27 апреля 2018

(==) имеет тип 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. Это можно сделать с помощью функции композиции.

...