Подтвердить что ты не робот

Haskell применяет одно значение к списку функций

Для присваивания я работаю над списком функций [Int → Int] (например, [(+3), (*4), (+1)]), и я хотел бы применить один Int к каждому из них, в свою очередь, создавая список результатов [Int]

Я уже много искал, но я не могу найти способ сделать такую операцию. Использование map не работает так, как я ожидал. Связанная с этим ошибка:

ERROR - Cannot infer instance
*** Instance   : Num ((Label -> Label) -> a)

В соответствии с запросом код:

data Tree = Node (Label -> Label) Label [Tree]
type Label = Int

testTree = Node (+1) 3 [ Node (+1) 5 [], Node (+1) 4 [Node (+1) 1 [], Node (+2) 7 []]]

listify :: Tree -> [(Label -> Label)]
listify t = [(getNodeFunction t)] ++ concat(map (listify) (getSubTrees t))


*Main> map (\f -> f 7) (listify testTree)

это действительно работает. Если бы кусок неисправного кода в файле все еще, извините за суету.

4b9b3361

Ответ 1

Вы можете использовать оператор $, который обозначает приложение функции.

> map ($ 3) [(+3), (*4), (+1)]
[6,12,4]

Это в основном расширяется до [(+3) $ 3, (*4) $ 3, (+1) $ 3], который является просто функциональным приложением.

Ответ 2

Если flist - это список функций, а x - аргумент, вам нужна map (\f → fx) flist.

Например

Prelude> map (\f -> f 10) [(4 +), (3 *)]
[14,30]

Ответ 3

Вы также можете использовать списки для этого. Этой строки достаточно для вашего примера:

[ f 3 | f <- [(+3), (*4), (+1)] ]

Это касается каждой функции в списке на правой стороне до значения (3 в данном случае) на левой стороне.


Для более общей версии это может быть полезно:

applyFuns :: [(a->b)] -> a -> [b]
applyFuns fs x = [ f x | f <- fs ]

applyFuns [(+3), (*4), (+1)] 3

Функция applyFuns принимает список функций из Типа a->b в качестве первого и значения типа b в качестве второго. Результатом является список типа b который содержит результат каждой функции в первом списке, примененной ко второму аргументу.