Son görevime gelene kadar ödevlerim gayet iyi geçti.Özel 'katlama' işlevinin karşılanması gerekir.
foldList :: (a -> b -> b) -> b -> List a -> b
foldList f b Nil = b
foldList f b (Cons a l) = f a (foldList f b l)
ikinci parametre ucunda kullanılan değerdir:
data List a = Nil | Cons a (List a) deriving Show
Başka bir görev, özel bir fold
işlev yazmak için:
Birincisi, özel bir List
yapısını tanımlamak zorunda listenin (bir Nil
öğesinde).
prodList :: List Int -> Int
prodList = foldList (\x y -> x * y) 1
ucunda 1
multplication nötr elemandır:
Ayrıca birbirleri ile verilen listeden her eleman çarpar bir işlev prodList
yazmak zorunda kaldı. Bu nedenle hesaplama üzerinde bir etkisi yoktur.
Sonuncusu, benim çözmem zor.
Bir ikili sayıyı temsil eden listenin ondalık değerini hesaplayan bir binList
işlevini yazmam gerekiyor. En az anlamlı bit, listenin ilk öğesidir, bu nedenle ikili sayı tersine çevrilir.
Verilen bir örnek, binList (Cons 1 (Cons 0 (Cons 0 (Cons 0 (Cons 1 Nil)))))
sonucunun 19 olması gerektiğidir (çünkü (10001) _2 (19) _10). Bununla birlikte, listenin sonucu [1,1,0,1], (1011) _2 = (11) _10) olmalıdır.
Ödevin suçu, 'un foldList
'u kullanmasıdır.
Her rakamı hesaplamak için nasıl biliyorum ama ben şu anda olduğum hangi endeks i
öğrenmek için bir yol bulmak için mücadele:
binList :: List Int -> Int
binList = foldList (\x y -> 2^i*x + y)
muhtemelen bu çözmek için güzel, köri yolu yoktur Haskell. Bu ödevi nasıl çözeceğinizi açıklayabilir misiniz? Eğer hesaplama yazmak için olsaydı
: Böyle tür görünen bir öz benzerlik olduğuna dikkat edin. (İpucu: 10 haneye sahipseniz, en önemlileri 2, 9 çarpı ile çarpılmalıdır ... bu listede sağdaki basamak sayısıdır .. hmm ....) – alternative
Fonksiyon uygulanır eleman bazında. Listenin öğelerinin her biri için 'i' değişiyor. Üssü belirlemek için endeksi bilmeden bunu nasıl yapabileceğimizi bilmiyorum. – J0hj0h
o.O Bu kadar kolay! İpucu için teşekkürler! Tamamen bunu yapmanın yolu unutuldu! : D – J0hj0h