BST'deki katlama işlevinin genelleştirilmiş versiyonunda Çok fazla argüman

oy
0

Çalıştırma kat (+) T = 0 numune beni çok fazla argüman uygulanan bir hata (+) yı verir. Niye ya?

data(Ord a, Show a, Read  a) => BST a = Void | Node {
    val :: a,
    left, right :: BST a
} deriving (Eq,  Ord,  Read,  Show)

sample = Node 5 (Node 3 Void Void) (Node 10 Void Void)

fold :: (Read a, Show a, Ord a) => (a -> b -> b ->  b) -> b -> BST a -> b
fold _ z Void         = z
fold f z (Node x l r) = f x (fold f z l) (fold f z r)
Occurs check: cannot construct the infinite type: a = a -> a
Probable cause: `+' is applied to too many arguments
In the first argument of `fold'', namely `(+)'
In the expression: fold' (+) 0 sample

Ayrıca bkz: kat

Oluştur 04/02/2011 saat 01:23
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

Sizin foldtüründe bir işlev gerektirir a -> b -> b -> bbirinci parametresi olarak, bu üç argüman alan bir fonksiyondur. (+)Öte yandan yalnızca iki argüman alır.

Eğer folddeğişmiş veya farklı bir işlevle diyoruz gerekirse yapmaya çalışıyoruz ne olduğuna bağlıdır edilmelidir.

Cevap 04/02/2011 saat 01:28
kaynak kullanıcı

oy
1

Senin sorunun 3 argümanları işlevini başvurduğunuz olduğunu. tipi imza ilk parametre her şeyi söylüyor.

fold :: (a -> b -> b -> b) -> b -> BST a -> b
fold f z (Node x l r) = f x (fold f z l) (fold f z r)

(+) Sadece 2 argüman alır, ancak bunu geçmek zaman, bu değerlendirmeye çalışır:

(+) x (fold (+) z l) (fold (+) z r) -- 3 arguments! =P

Muhtemelen bir ikili fonksiyonu ile katlamak istiyoruz (a -> a -> a). Eğer (+) kullanmak istediğinizi varsayalım. Böyle olmasını sonucunu istiyorum:

fold f z (Node x l r) = x + (fold f z l) + (fold f z r)

Sadece değiştirin: Oradan genelleme kolay +bir sabitlendikten ilef

fold f z (Node x l r) :: (a -> a -> a) -> a -> BST a -> a
fold f z (Node x l r) = x `f` (fold f z l) `f` (fold f z r)
Cevap 04/02/2011 saat 04:13
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more