“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”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

递归重命名文件 Mac OSX

Storyboard Segue 标识符命名约定

关于视图模型的命名约定以避免长名称

Laravel 中多对多关系中连接表的命名约定

递归,匿名函数

递归与内置函数