haskell - 理解 Haskell 中的 let 表达式
问题描述
我是 Haskell 的新手,目前正在为考试而学习。我一直从learnyouahaskell学习它。我不明白 group 函数中的以下 let 表达式。
splitWhen :: (a -> Bool) -> [a] -> ([a],[a])
splitWhen p xs = (takeWhile (not . p) xs, dropWhile (not . p) xs)
group :: (Eq a) => [a] -> [[a]]
group [] = []
group (x:xs) = let (group1, rest) = splitWhen (/=x) xs
in (x:group1) : group rest
我知道 splitWhen 做什么:splitWhen even [1,2,3] => ([1],[2,3])
我知道功能组产生以下内容:
group [1,1,2,1,3,3,3] => [[1,1],[2],[1],[3,3,3]]
我不明白它是如何工作的。有人可以向我解释一下吗?谢谢你。
解决方案
let
表达式是立即应用匿名函数的语法糖。那是,
let (group1, rest) = splitWhen (/=x) xs
in (x:group1) : group rest
相当于
(\(group1, rest) -> (x:group1) : group rest) (splitWhen (/=x) xs)
换句话说,let
反转函数体和函数参数的位置。相比
let name = value in body
( \name -> body ) value
推荐阅读
- python - 是否可以在 python 函数中强制数据不变性?
- django - 图标缓存的奇怪行为
- postgresql - 解释分析 - 成本与实际时间的关系
- php - 取消订阅简介被任意删除
- spring-boot - 使用 HikariCP 和 AWS Aurora Serverless 的连接池配置
- python - 如何知道一个窗口是否使用pywin32最大化?
- javascript - Node.js - 从 JSON 对象参考解析图像
- c++ - 在 QMake 文件中切换编译器
- tsql - 使用未使用提示参数更新的参数访问传递查询
- ajax - 实现了子文件夹的 Ajax URL 不正确