haskell - Haskell:关于部分应用的问题
问题描述
我正在阅读《Learn You a Haskell for Great Good!》这本书 由 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"
推荐阅读
- ssl - Gatling:WebSocketHandshakeException:无效的握手响应 getStatus:400 错误请求
- css - SCSS如何访问另一个文件中的样式元素
- c++ - 无法更新蓝牙连接参数
- google-api - 如何使用 NPM 从 Ads API 获取广告名称?
- node.js - AWS lambda 限制来自特定事件源的并发调用
- javascript - 如何将仅编译时的全局变量传递给我的代码?
- r - Shiny 中的每个选项卡都有不同的选项卡和不同的 UI
- python-3.x - ImportError: DLL load failed: 找不到指定的模块||pywraplp
- python - 如何在 django 中播放本地文件夹中的视频?
- javascript - 未捕获的类型错误:无法读取未定义的属性“顶部”