2014-11-22 10 views
10

Bir görev için [Int -> Int] (ör. [(+3), (*4), (+1)]) işlevlerinin bir listesi üzerinde çalışıyorum ve bunların her birine tek bir Int uygulamak ve sonuçların bir listesini oluşturmak istiyorum [Int]Haskell, işlevlerin bir listesine tek bir değer uygular

Zaten çok arama yaptım, ancak böyle bir işlemi yapmanın bir yolunu bulamıyorum. map'u kullanarak beklediğim gibi çalışmıyor. Bu gerçekten çalışıyor

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) 

:

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

olarak kodu talebinde: İlgili hata budur. Dosyada bir hata kodu parçası vardı, yaygara için özür dilerim.

+1

map map kullanan haritayı göster –

+0

Bu, ilgili değil ama 'Tree 'türünüz biraz garip. Tam olarak ne yapmaya çalıştığını bilmiyorum, ama iki kavramı bir araya getiriyor gibi görünüyor: şeylerin bir ağacını yapmak ve bazı şeyleri bir araya getirmek. 'Data.Tree' (GHC ile birlikte gelen "konteynerler" paketinden) kullanmayı düşünebilirsiniz, bu durumda türünüze oldukça yakın bir nokta "Ağaç (Etiket -> Etiket, Etiket)" olarak ifade edilebilir. Bunu böldüğünüzde, her türlü genel amaçlı “Ağaç” işlevlerini kullanırsınız. – dfeuer

+0

Bu ağaç türü ödevde verilmiştir. Muhtemelen, öğrencilerin yaşadığı cehennemden rahatsız olma niyeti ile. – nitowa

cevap

21

Sen fonksiyon uygulaması açılımı $ operatörünü kullanabilirsiniz.

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

Bu temelde sadece fonksiyon uygulama olan [(+3) $ 3, (*4) $ 3, (+1) $ 3] genişler.

2

flist işlevlerin listesi ise ve x argümanıdır, map (\f -> f x) flist'a ihtiyacınız var. Örneğin

için

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