Anonim işlevlerle katlama

0

Soru

Şu anda katlamayı öğrenmeye çalışıyorum.

Ancak önceden tanımlanmış işlevleri kullanmak yerine kendiminkini kullanmak istiyorum.

Ben bir Dize tüm sesli harfleri çift istiyor.

doubleVowels :: String -> String

Benim girişimim (yine de sadece 'a' için, önce bir harf için çözmeye çalışıyorum ve bir kez çalıştığında onu genişletip optimize edeceğim):

doubleVowels :: String -> String
doubleVowels  a = foldl (\eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a

O kodu çalıştırmaya çalışıyorum Şu erorr alıyorum:

Experimenting.hs:8:78: error:
    * Couldn't match type `[Char]' with `Char -> Char'
      Expected type: Char -> Char
        Actual type: String
    * In the expression: a
      In the expression: if eachChar == 'a' then (a ++ "aa") else a
      In the first argument of `foldl', namely
        `(\ eachChar -> if eachChar == 'a' then (a ++ "aa") else a)'
  |
8 | doubleVowels a = foldl (\eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
  |                                                                              ^

Experimenting.hs:8:81: error:
    * Couldn't match expected type `Char' with actual type `[Char]'
    * In the second argument of `foldl', namely `""'
      In the expression:
        foldl
          (\ eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
      In an equation for `doubleVowels':
          doubleVowels
            = foldl
                (\ eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
  |
8 | doubleVowels a = foldl (\eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
  |                                                                                 ^^
Failed, no modules loaded.

2

En iyi cevabı

4
doubleVowels :: String -> String
doubleVowels  a = foldr (\eachChar b -> if eachChar == 'a' then ("aa" ++ b) else (eachChar:b)) "" a

Çoğu durumda, bunun için özel bir neden yoksa foldl, kullanma foldr yerine foldl haskell derleyicisinin ifadenizi tembel bir şekilde değerlendirmesine izin verdiği için. Doğru hatırlıyorsam, o zaman bile kullan foldl', beri foldl katı değildir ve tembellik için herhangi bir fayda sağlamazken çok fazla bellek alır.

Bunun dışında, ikinci argümanı kaçırıyorsunuz foldrs (veya foldls) işlevi. foldr türü vardır:

foldr :: (a -> b -> b) -> b -> t a -> b

İşlev için foldr türü vardır a -> b -> b burada ilk argüman katlama yapısının mevcut elemanıdır ve ikincisi akümülatördür. Kullanmakta olduğunuz lambda yalnızca bir parametre vardır.

Ek olarak, lambda fonksiyonunun gövdesi de pek mantıklı değil.

if eachChar == 'a' then (a ++ "aa") else a)

a çevreleyen fonksiyonun parametresidir doubleVowels alıyor. Burada lambda işlevinin parametrelerini kullanmanız gerekir.

2021-11-20 04:24:46
4

Öncelikle, işlevi kullanılır foldl iki tartışması olmalı. Birincisi yığılmış sonuç, diğeri ise mevcut karakterdir. İkincisi, foldl'nin değerlendirme sırası soldan sağa doğrudur, bu yüzden reverse sonuç dizesi.

Örneğin, burada değiştirilmiş bir sürüm var

 doubleVowels :: String -> String
 doubleVowels s = reverse $ foldl (\x y -> if y == 'a' then ("aa" ++ x) else (y : x)) "" s
2021-11-20 04:13:13

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

Bu kategoride popüler

Popüler soruları bu kategoride