Skladacie s anonymné funkcie

0

Otázka

Ja som v súčasnej dobe snažia naučiť skladanie.

Ale namiesto preddefinovaných funkcií chcem použiť môj vlastný.

Tak sa chcem dvojité všetky samohlásky v reťazci.

doubleVowels :: String -> String

Môj pokus je (zatiaľ len na "a", ako som skúste vyriešiť ju jeden list, prvý a expanduje a optimalizovať ho, keď beží):

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

Pokúša spustiť on kód vypisuje nasledovné erorr:

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

Najlepšiu odpoveď

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

Vo väčšine prípadov, ak nie je žiadny konkrétny dôvod pre foldlpoužite foldr namiesto foldl ako to umožňuje Gnu kompilátor lenivo zhodnotiť svoje vyjadrenie. Ak si správne pamätám, aj potom pomocou foldl',, pretože foldl nie je striktné a zaberá príliš veľa pamäte, zatiaľ čo nedáva vám akýkoľvek prospech pre lenivosť.

Okrem toho, vám chýba druhý argument foldrs (alebo foldls) funkciu. foldr má typu:

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

Funkcia na foldr má typ a -> b -> b v prípade, že prvý argument je aktuálny prvok skladacie štruktúra a druhý je akumulátor. Lambda, ktorý používate, má iba jeden parameter.

Okrem toho, telo lambda funkcia tiež nemá veľmi zmysel.

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

a je parameter, ktorý okolité funkcie doubleVowels dostane. Musíte použiť parametre lambda funkciu tu.

2021-11-20 04:24:46
4

V prvom rade funkciu použité v foldl by mal mať dve argments. Prvý z nich je accmulated výsledok, a iné aktuálne je char. Po druhé, aby hodnotenia foldl je zľava doprava, tak sme si reverse výsledok reťazec.

Napríklad, tu je modifikovaná verzia

 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

V iných jazykoch

Táto stránka je v iných jazykoch

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

Populárne v tejto kategórii

Obľúbené otázky v tejto kategórii