我是Haskell的新手,目前正在研究它进行考试.我一直在从learnyouahaskell学习它.我不理解组函数中的以下let-expression.
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
Run Code Online (Sandbox Code Playgroud)
我知道什么是splitWhen: splitWhen even [1,2,3] => ([1],[2,3])
我知道功能组产生如下:
group [1,1,2,1,3,3,3] => [[1,1],[2],[1],[3,3,3]]
Run Code Online (Sandbox Code Playgroud)
我不明白它是如何工作的.有人可以向我解释一下吗?谢谢.
let表达式是用于立即应用匿名函数的语法糖.那是,
let (group1, rest) = splitWhen (/=x) xs
in (x:group1) : group rest
Run Code Online (Sandbox Code Playgroud)
相当于
(\(group1, rest) -> (x:group1) : group rest) (splitWhen (/=x) xs)
Run Code Online (Sandbox Code Playgroud)
换句话说let,将函数体的位置和函数的参数反转.相比
let name = value in body
( \name -> body ) value
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |