Pliere cu funcții anonime

0

Problema

Eu sunt în prezent încearcă să învețe de pliere.

Dar în loc de a folosi functii predefinite vreau să folosesc propria mea.

Așa că vreau să dubleze toate vocalele într-un Șir.

doubleVowels :: String -> String

Încercarea mea este (încă doar pentru "a", cât încerc să-l rezolve pentru o scrisoare și se va extinde și de a optimiza, de îndată ce se execută):

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

Încercarea de a rula codul primesc următoarele 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

Cel mai bun răspuns

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

În cele mai multe cazuri, dacă nu există nici un motiv specific pentru foldl, utilizare foldr în loc de foldl deoarece permite Haskell compiler să alene evalua expresia. Dacă îmi amintesc corect, chiar și atunci utilizare foldl', deoarece foldl nu este strictă și durează prea mult de memorie în timp ce nu da nici un beneficiu pentru lene.

În afară de asta, îți lipsește cel de-al doilea argument pentru a foldrs (sau foldls) funcție. foldr a tip:

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

Funcția de a foldr a tip a -> b -> b în cazul în care primul argument este elementul curent de pliere structura și al doilea este de la acumulator. Lambda pe care îl utilizați are un singur parametru.

În plus, organismul de funcție lambda, de asemenea, nu prea are sens.

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

a este parametrul care înconjoară funcție doubleVowels primește. Ai nevoie de a utiliza parametrii lambda funcție de aici.

2021-11-20 04:24:46
4

Mai întâi de toate, funcția utilizate în foldl ar trebui să aibă două argments. Primul este accmulated rezultat, iar celălalt este curent char. În al doilea rând, ordinea de evaluare a foldl este de la stânga la dreapta, așa că trebuie să reverse rezultatul șir.

De exemplu, aici este o versiune modificată

 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

În alte limbi

Această pagină este în alte limbi

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

Popular în această categorie

Întrebări frecvente în această categorie