typ*_*ris 30 syntax haskell guard-clause pattern-guards
在我正在阅读的代码库中,我发现了一个像这样的函数声明(缺少某些部分):
filepathNormalise :: BS.ByteString -> BS.ByteString
filepathNormalise xs
| isWindows, Just (a,xs) <- BS.uncons xs, sep a, Just (b,_) <- BS.uncons xs, sep b
= '/' `BS.cons` f xs
Run Code Online (Sandbox Code Playgroud)
逗号在这里做什么?
(只有作为奖励,如果有人知道这一点:Haskell编程中提到的这个语法是从第一原则开始的,如果是这样的话,在哪里?我记不起来了解它.)
Chr*_*tin 28
Haskell 2010第3.13节,Case Expressions中描述了警卫 (该部分是关于案例表达式,而不是顶级声明,但可能是语义相同):
guards ? | guard1, …, guardn (n ? 1)
guard ? pat <- infixexp (pattern guard)
| let decls (local declaration)
| infixexp (boolean guard)
Run Code Online (Sandbox Code Playgroud)
对于每个受保护的表达式,从左到右依次尝试以逗号分隔的守卫.如果所有这些都成功,则在使用警卫引入的绑定扩展的环境中评估相应的表达式.也就是说,由后卫(通过使用let子句或模式保护)引入的绑定在以下防护和相应表达式的范围内.如果任何一名守卫失败,那么这个守卫的表达式就会失败并且会尝试下一个守卫的表达.
在简单的情况下,逗号的作用类似于布尔和.但是逗号更强大,因为每个守卫都可以引入后续守卫使用的新绑定(从左到右).
守卫中的逗号是不常见的(根据我的经验,至少)我将此功能描述为Haskell琐事 - 完全没有必要写(或者,大多数情况下,阅读)Haskell.我怀疑Haskell编程从第一原则遗漏了它的原因.
归档时间: |
|
查看次数: |
1412 次 |
最近记录: |