I've come across the following code snippet (a function definition):
choose (x:xs) = choosep x xs
where choosep x [] = x
choosep x (_:_) = x
choosep _ (x:xs) = choosep x xs
in Curry programming language in a "standard library"--/usr/lib/curry-0.9.11/Success.curry from Muenster Curry Compiler. Here:
choose :: [a] -> a
and
choosep :: a -> [a] -> a -- BTW, not a _p_redicate
Is the "p" suffix for the helper recursive function choosep a known naming convention? Perhaps it comes from functional programming tradition (Haskell) or logical programming (Prolog?). What does it mean then?
(This function was considered in Why is the non-deterministic choice function in Curry's std lib not defined straightforwardly but rather with a helper 2-argument function?.)
4 Answers 4
In this case, I believe p stands for "prime". Rather than calling the helper choose' or chooseprime, they use choosep.
1 Comment
' would be clearer than p ;)I think it stands for 'prime' -- in OCaml, which allows ' in identifiers, helper functions are frequently named foo'. At a high level, I think this (and the use of 'where' for a post-hoc helper definition) stems from the desire to allow functional programs to resemble their equivalent definitions in pure math.
5 Comments
' in identifiers.') in names, and there are primes in variable names in other "standard" modules' implementations. (Out of curiosity, I'll perhaps look whether there are occurences of ' in function names.) So, the way to this "p" is somewhat strange: write out a ' as prime, then abbreviate it to p... ;)In this context, as others have noted, it probably doesn't apply, but there is a popular Lisp convention of using a final 'p' to denote a predicate. See jargon p-convention.
I personally prefer the Ruby convention of ending a predicate with a '?'.
2 Comments
p sticked not to a predicate...? is a convention in many Lisps (and some relatives like Scheme and Logo) as well. Common Lisp, unfortunately, does not follow.P stands for 'predicate'. A thing that returns 'true' or 'false'.
3 Comments
choose's type is [a] -> a, not a predicate. And choosep :: a -> [a] -> a.Explore related questions
See similar questions with these tags.