什么是帮助函数的好名字?

时间:2012-05-24 15:24:49

标签: haskell naming-conventions

考虑以下问题:给定一个长度为三的元组列表(String,Int),是否有一对具有相同“Int”部分的元素? (例如,[("bob",5),("gertrude",3),("al",5)]包含这样的一对,但[("bob",5),("gertrude",3),("al",1)]不包含。)

这就是我实现这样一个功能的方法:

import Data.List (sortBy)
import Data.Function (on)

hasPair::[(String,Int)]->Bool
hasPair = napkin . sortBy (compare `on` snd)
  where napkin [(_, a),(_, b),(_, c)] | a == b = True
                                      | b == c = True
                                      | otherwise = False

我使用模式匹配将名称绑定到元组的“Int”部分,但我想先排序(为了像成员一样分组),所以我把模式匹配函数放在{ {1}}条款。但这让我想到了一个问题:where子句中的函数选择名称的好策略是什么??我希望能够迅速想到这些名字。对于这个例子,“hasPair”似乎是一个不错的选择,但它已经被采用了!我发现这个模式出现了很多 - 辅助函数的自然看似名称已被调用它的外部函数占用。因此,我有时会称这样的帮助函数为“op”,“foo”,甚至是“helper” - 在这里我选择了“餐巾”来强调它的使用 - 一次性,扔掉它的性质。

所以,亲爱的Stackoverflow读者,你会称之为“餐巾纸”?更重要的是,你如何处理这个问题?

4 个答案:

答案 0 :(得分:25)

本地范围的变量命名的一般规则。

  • fkgh用于超级简单的本地,半匿名事物
  • go for(tail)recursive helpers(precedent
  • nmij了解长度和尺寸以及其他数值
  • v了解地图查找和其他字典类型的结果
  • st表示字符串。
  • a:as以及x:xsy:ys列表。
  • (a,b,c,_)用于元组字段。

这些通常仅适用于HOF的论据。对于您的情况,我会选择keq3

谨慎使用撇号,以获取派生值。

答案 1 :(得分:3)

我倾向于为谓词调用布尔值函数p。遗憾的是,pred已被采纳。

答案 2 :(得分:2)

在这种情况下,内部函数与外部函数基本相同,但具有不同的前提条件(要求对列表进行排序),我有时会使用带有素数的相同名称,例如hasPairs'

然而,在这种情况下,我宁愿尝试将问题分解为在顶层自己有用的部分。这通常也使得命名更容易。

hasPair :: [(String, Int)] -> Bool
hasPair = hasDuplicate . map snd

hasDuplicate :: Ord a => [a] -> Bool
hasDuplicate = not . isStrictlySorted . sort

isStrictlySorted :: Ord a => [a] -> Bool
isStrictlySorted xs = and $ zipWith (<) xs (tail xs)

答案 3 :(得分:1)

我的策略非常密切地遵循唐的建议:

  1. 如果有明显的名称,请使用它。
  2. 使用go如果是“工作人员”或与原始功能目的非常相似。
  3. 根据上下文遵循个人约定,例如stepstart用于折叠。
  4. 如果所有其他方法都失败了,只需使用通用名称,例如f
  5. 我个人避免使用两种技术。一种是使用原始函数的撇号版本,例如hasPair'的where子句中的hasPair。当你指的是另一个时,意外写一个就太容易了;在这种情况下,我更喜欢使用go。但只要功能有不同的类型,这不是一个大问题。另一种是使用可能意味着什么的名称,但不是与功能实际上有什么关系的任何东西。 napkin属于此类别。当您重新访问此代码时,此命名选项可能会让您感到困惑,因为您将忘记将其命名为napkin的原因。 (因为餐巾有四个角落?因为它们很容易折叠?因为它们可以清理混乱?它们在餐馆中被发现?)其他违规者是bobmyCoolFunc

    如果您为函数指定的名称比goh更具描述性,那么您应该能够查看使用它的上下文或者功能,并在两种情况下都很清楚为什么选择这个名称。这就是我的观点#3:个人约定。 Don的许多建议都适用。如果您在协作情况下使用Haskell,那么请与您的团队协调并确定常见情况的某些约定。