“foop”:命名约定?它是“foo”的辅助递归函数;后缀“p”是啥意思?
Posted
技术标签:
【中文标题】“foop”:命名约定?它是“foo”的辅助递归函数;后缀“p”是啥意思?【英文标题】:"foop": a naming convention? It's a helper recursive function for "foo"; what does the suffix "p" mean?“foop”:命名约定?它是“foo”的辅助递归函数;后缀“p”是什么意思? 【发布时间】:2011-03-11 22:59:51 【问题描述】:我遇到过以下代码 sn-p(一个函数定义):
choose (x:xs) = choosep x xs
where choosep x [] = x
choosep x (_:_) = x
choosep _ (x:xs) = choosep x xs
在“标准库”中的Curry programming language 中--/usr/lib/curry-0.9.11/Success.curry 来自Muenster Curry Compiler。这里:
choose :: [a] -> a
和
choosep :: a -> [a] -> a -- BTW, not a _p_redicate
辅助递归函数choosep
的“p”后缀是已知的命名约定吗?也许它来自函数式编程传统(Haskell)或逻辑编程(Prolog?)。那是什么意思呢?
(这个函数在Why is the non-deterministic choice function in Curry's std lib not defined straightforwardly but rather with a helper 2-argument function?中被考虑过。)
【问题讨论】:
【参考方案1】:在这种情况下,我相信p
代表“素数”。他们没有调用助手choose'
或chooseprime
,而是使用choosep
。
【讨论】:
是的,这似乎是合理的。'
会比 p
更清晰;)【参考方案2】:
我认为它代表“prime”——在 OCaml 中,它允许在标识符中使用 '
,辅助函数经常被命名为 foo'
。在高层次上,我认为这(以及使用 'where' 来进行事后帮助定义)源于希望允许函数式程序在纯数学中类似于它们的等效定义。
【讨论】:
据我所知,Muenster Curry 编译器还允许在标识符中使用'
。
是的,这些语言中的名称有一个非常好的地方——它们允许在末尾写素数,这样看起来就像数学。当我在学习 Haskell 时第一次看到它时,我很高兴。好吧,Curry 还允许名称中使用更真实的素数符号 ('
),并且在其他“标准”模块的实现中,变量名中也有素数。 (出于好奇,我可能会看看 function 名称中是否出现 '
。)所以,这个“p”的方式有点奇怪:写一个 '
为prime
,然后将其缩写为p
... ;)
@Gabe: 路径依赖然后:)
@imz:也许唯一确定的方法就是给这个人发电子邮件:informatik.uni-kiel.de/~mh ?
是的。好的,如果这不是众所周知的命名约定,那我可能不会打扰。【参考方案3】:
在这种情况下,正如其他人所指出的,它可能不适用,但有一个流行的 Lisp 约定,即使用结尾的“p”来表示谓词。见jargon p-convention。
我个人更喜欢用 '?' 结束谓词的 Ruby 约定。
【讨论】:
感谢您的评论!这就是为什么它看起来有点误导:p
不坚持谓词...
以?
结尾的谓词名称在许多 Lisps(以及一些类似的如 Scheme 和 Logo)中也是一种惯例。不幸的是,Common Lisp 没有跟进。【参考方案4】:
P 代表“谓词”。返回“真”或“假”的事物。
【讨论】:
我一开始也是这么想的,但在这种情况下,函数不是谓词。 是的,choose
的类型是 [a] -> a
,不是谓词。还有choosep :: a -> [a] -> a
.
嗯,这很有趣。 'foop' 作为 foo 谓词在其他领域有着悠久的传统,这些haskellers 很奇怪。以上是关于“foop”:命名约定?它是“foo”的辅助递归函数;后缀“p”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章