首页 > 解决方案 > 理解 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]]

我不明白它是如何工作的。有人可以向我解释一下吗?谢谢你。

标签: haskell

解决方案


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

推荐阅读