折叠与匿名的功能

0

的问题

目前,我正在努力学习折叠。

但不是采用预定的功能我想用我自己的。

所以我希望双所有元音在一串。

doubleVowels :: String -> String

我尝试(但只是'a',因为我是试图解决这个问题对一个字母的第一个,并将扩大和优化它,一旦运行):

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

试图运行他的代码我让下述错误:

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

最好的答案

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

在大多数情况下,如果没有具体的原因 foldl使用 foldr 而不是的 foldl 因为它允许Haskell编译器懒洋洋地评估您的表达。 如果我正确地记得,即使是那么使用 foldl',由于 foldl 不是严格和需要太多的存储器,同时不会给你任何受益于懒惰。

除此之外,你是失踪的第二个参数 foldrs(或 foldls)的功能。 foldr 具有类型:

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

该功能 foldr 具有类型 a -> b -> b 其中第一个论点是当前元的折叠式结构,第二个是累加器。 Lambda您使用的是只有一个参数。

此外,身体对氧功能也没有多大意义。

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

a 是的参数周围的功能 doubleVowels 接收。 你需要使用的参数lambda功能。

2021-11-20 04:24:46
4

首先,该功能的使用在 foldl 应该有两个argments. 第一个是accmulated结果,另一个是目前的焦炭。 第二,为了评价的foldl是从左到右边,所以我们要 reverse 结果字符串中。

例如,这里是一个修改版本

 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

其他语言

此页面有其他语言版本

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

受欢迎的此类别

流行的问题,在这个类别