2014-11-22 2 views
10

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

Я уже много искал, но я не могу найти способ выполнить такую ​​операцию. Использование 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) 

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

+1

показать нам код, который использует карту –

+0

Это не связано с вашим вопросом, но ваш тип 'Tree' немного странный. Я не знаю, что вы пытаетесь сделать с ним точно, но, похоже, объединяет две концепции: создание дерева вещей и объединение некоторых вещей вместе. Возможно, вам стоит рассмотреть возможность использования 'Data.Tree' (из пакета' container', который поставляется с GHC), и в этот момент что-то довольно близкое к вашему типу может быть выражено как «Tree (Label -> Label, Label)». Разбивая это так, вы можете использовать всевозможные функции «Tree» общего назначения. – dfeuer

+0

Этот тип дерева задается в задании. Предположительно, с намерением раздражать когда-либо живого ад из студентов. – nitowa

ответ

21

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

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

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

2

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

Например

Prelude> map (\f -> f 10) [(4 +), (3 *)] 
[14,30] 
Смежные вопросы