2014-11-22 19 views
10

dla przydziału pracuję nad listą funkcji [Int -> Int] (np. [(+3), (*4), (+1)]) i chciałbym zastosować pojedynczy Int do każdego z nich, co z kolei tworzy listę wyników [Int]Haskell zastosować pojedynczą wartość na liście funkcji

Już dużo przeszukałem, ale nie jestem w stanie znaleźć sposobu na wykonanie takiej operacji. Używanie map nie działa tak, jak bym się spodziewał. Powiązany błąd to:

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

Zgodnie z wnioskiem kod:

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) 

to faktycznie działa. Wciąż miał w pamięci plik wadliwego kodu, przepraszam za zamieszanie.

+1

pokaż nam kod, który używa mapy –

+0

Nie jest to związane z twoim pytaniem, ale twój typ 'Tree' jest po prostu trochę dziwny. Nie wiem, co dokładnie próbujesz z tym zrobić, ale wydaje się, że łączy w sobie dwa pojęcia: tworzenie drzewa rzeczy i parowanie pewnych rzeczy razem. Możesz rozważyć użycie 'Data.Tree' (z pakietu' containers', który pochodzi z GHC), w którym to momencie coś bardzo bliskiego twojemu typowi może być wyrażone jako 'Tree (Label -> Label, Label)'. Rozbijając go w ten sposób, można by użyć wszystkich rodzajów funkcji drzewa ogólnego przeznaczenia. – dfeuer

+0

Ten typ drzewa jest podany w zadaniu. Przypuszczalnie z zamiarem denerwowania wiecznie żywego piekła uczniów. – nitowa

Odpowiedz

21

Można użyć operatora $, który stoi do stosowania funkcji.

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

To w zasadzie rozszerza się do [(+3) $ 3, (*4) $ 3, (+1) $ 3], która jest po prostu funkcją funkcji.

2

Jeśli flist jest listą funkcji, a x jest argumentem, potrzebujesz map (\f -> f x) flist.

Na przykład

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