簡體   English   中英

Haskell:關於部分應用的問題

[英]Haskell: Question about Partial Application

我正在閱讀“為了大好而學習你的哈斯克爾!”這本書。 由Miran Lipovaca撰寫並在第5章中學習高階函數。

其中一個示例涉及以下功能:

applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)

以下是函數輸出的示例:

ghci> applyTwice (++ " HAHA") "HEY"
"HEY HAHA HAHA"

ghci> applyTwice ("HAHA " ++) "HEY"
"HAHA HAHA HEY"

對於第一個示例,我理解字符串是通過以下方式使用串聯運算符生成的:

"HEY" ++ " HAHA"
"HEY HAHA" ++ " HAHA"
"HEY HAHA HAHA"

但是,我不明白連接運算符在第二個示例中是如何工作的。 輸出字符串“HAHA HAHA HEY”是如何產生的? 任何見解都表示贊賞。

對於第一個示例,我理解字符串是通過以下方式使用串聯運算符生成的:

 "HEY" ++ " HAHA" "HEY HAHA" ++ " HAHA" "HEY HAHA HAHA" 

而不是直接跳轉到中綴表達式(即++介於其間),如果您根據函數進行思考,它會有所幫助。

(++ " HAHA") :: [Char] -> [Char]   -- #1 this is a function (++ is partially applied)     
"HEY" :: [Char]

(++ " HAHA") "HEY"                 -- apply "HEY" as an argument to #1
-- same as "HEY" ++ " HAHA"

(+) :: (Num a) => a -> a -> a      -- #2 a binary function
(+) 1 2                            -- #3 apply 1 and 2 as arguments to #2
-- same as 1 + 2

-- technically, #3 is curried as
--    ((+) 1) 2                    -- i.e. (+) 1 is a partially applied function, which is then applied to 2     

如果你將(++ " HAHA")替換為applyTwice的定義,你就得到了

applyTwice f x = f (f x)
applyTwice (++ " HAHA") "HEY" = (++ " HAHA") ((++ " HAHA") "HEY")

                              = (++ " HAHA") ("HEY" ++ " HAHA")
                              = (++ " HAHA") ("HEY HAHA")
                              = "HEY HAHA" ++ " HAHA"
                              = "HEY HAHA HAHA"

現在使用applyTwice ("HAHA " ++) "HEY"

applyTwice f x = f (f x)
applyTwice ("HAHA " ++) "HEY" = ("HAHA " ++) (("HAHA " ++) "HEY")

                              = ("HAHA " ++) ("HAHA " ++ "HEY")
                              = ("HAHA " ++) ("HAHA HEY")
                              = "HAHA " ++ "HAHA HEY"
                              = "HAHA HAHA HEY"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM