ส่วนพับเก็บได้กับระบุชื่อไม่ฟังก์ชัน

0

คำถาม

ฉันกำลังพยายามที่จะเรียนส่วนพับเก็บได้.

แต่แทนที่จะใช้ค่าที่นิยามไว้แล้วฟังก์ชันที่ฉันต้องการที่จะใช้ของฉันเอง

ดังนั้นฉันต้องการให้สองเท่าทั้ง vowels ในข้อความ

doubleVowels :: String -> String

ของฉันคือความพยายาม(ยังแค่สำหรับ"a"อย่างที่ฉันพยายามแก้ไขมันสำหรับหนึ่งจดหมายแรกและจะขยายและ the result will be artificially smoothed to hide jpeg artefacts มันเมื่อมันวิ่ง):

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

พยายามที่จะวิ่งหนีเขารหัสฉันกำลังต่อไปนี้ 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

คำตอบที่ดีที่สุด

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

ในที่สุดคดีถ้าไม่มีเหตุผลที่เจาะจง foldlใช้ foldr แทนที่จะเป็น foldl มันจะทำให้ภาษา haskelllanguage คอมไพเลอร์ต้อง lazily ประเมินผลของคุณแสดงออก ถ้าฉันจำได้อย่างถูกต้องแม้แต่จากนั้นใช้ foldl'ตั้งแต่ foldl มันไม่เข้มงวดและต้องใช้มากเกินไปความทรงจำขณะที่ไม่ให้คุณมีผลประโยชน์สำหรับ laziness.

นอกจากนั้นคุณจะหายไปสองเถียงกันไป foldrs(หรือ foldls)ฟังก์ชัน. foldr มีประเภท:

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

ฟังก์ชันไป foldr มีประเภท a -> b -> b อยู่ที่ไหนข้อโต้แย้งแรกคือตัวปัจจุบันธาตุของที่พับโครงสร้างและคนที่สองคือ accumulator. ที่ lambda ว่าคุณกำลังใช้คนเดียวพารามิเตอร์.

ที่เพิ่มมานอกเหนือจากศพของ 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ý
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่