Применение функции фильтра, которая принимает два аргумента к списку, созданному функцией, которая принимает один аргумент в Haskell - PullRequest
0 голосов
/ 24 марта 2019

В Haskell я определил функцию фильтра, которая принимает два аргумента и возвращает Bool, т.е.

myFilter :: a -> b -> Bool

Я определил функцию, которая принимает один аргумент и возвращает список, т.е.

myFunction :: a -> [b]

Аргумент myFunction принимает тот же аргумент, что и myFilter, а элементы списка, выводимого myFunction, того же типа, что и второй аргумент myFilter, т. Е.

myFunction a = [b]
myFilter a b = Bool

Я хочу определить другую функцию, myFilteredFunction,

myFilteredFunction :: a -> [b]

Это принимает один аргумент a, тот, который и myFilter, и myFunction это, и возвращает подмножество [b], которое включает только элементы, которые удовлетворяют предикату, установленному myFilter, то есть, что фильтрует выходные данные myFunction, используя myFilter. Это кажется таким простым делом, и все же я не смог заставить его работать (я новичок в Haskell)!

Некоторые из опций, которые я пробовал, которые, очевидно, не работают:

myFilteredFunction = myFilter . myFunction
myFilteredFunction' = filter myFilter . myFunction
myFilteredFunction'' = myFilter . (map myFunction)

Я вижу проблему в том, что myFilter принимает два аргумента, а две другие функции принимают только один ... очень полезная помощь.

1 Ответ

4 голосов
/ 24 марта 2019

Ваш вопрос не ясен на 100%, но я думаю, вы могли бы иметь в виду это?

myFilteredFunction :: a -> [b]
myFilteredFunction a = filter (\b -> myFilter a b) (myFunction a)

То есть вы применяете myFunction для получения списка, а затем фильтруете его в соответствии с тем, дает ли myFilter True применительно к исходному элементу и проверяемому элементу.

Обратите внимание, что функция, примененная к filter, может быть упрощена с помощью частичного применения:

myFilteredFunction a = filter (myFilter a) (myFunction a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...