11

考虑以下问题:给定长度为三个元组 (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”部分,但我想先排序(以便对类似成员进行分组),所以我将模式匹配函数放在了一个where子句中。但这让我想到了我的问题:为存在于子句中的函数选择名称的好策略是什么where?我希望能够快速想出这样的名字。对于这个例子,“hasPair”似乎是一个不错的选择,但它已经被采用了!我发现这种模式出现了很多 - 辅助函数的看似自然的名称已经被调用它的外部函数采用。因此,有时我将此类辅助函数称为“op”、“foo”甚至“helper”——在这里我选择了“napkin”来强调它的一次性使用,

那么,亲爱的 Stackoverflow 读者,你会怎么称呼“餐巾纸”?更重要的是,您一般如何处理这个问题?

4

4 回答 4

25

局部范围变量命名的一般规则。

  • f, k, g,h用于超级简单的本地半匿名事物
  • gofor (tail) 递归助手(先例
  • n, m, i,j用于长度和大小以及其他数值
  • v用于地图查找和其他字典类型的结果
  • st字符串。
  • a:asx:xs用于y:ys列表。
  • (a,b,c,_)对于元组字段。

这些通常仅适用于 HOF 的参数。对于你的情况,我会选择类似的东西kor eq3

对于派生值,请谨慎使用撇号。

于 2012-05-24T15:29:04.553 回答
3

我倾向于将布尔值函数称为p谓词。pred,不幸的是,已经采取了。

于 2012-05-24T18:58:54.820 回答
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)
于 2012-05-25T02:13:35.853 回答
1

我的策略非常接近 Don 的建议:

  1. 如果它有一个明显的名称,请使用它。
  2. go如果它是“工人”或在其他方面与原始功能非常相似,则使用它。
  3. 遵循基于上下文的个人约定,例如stepstartargs 折叠起来。
  4. 如果一切都失败了,只需使用通用名称,例如f

我个人避免使用两种技术。一种是使用原始函数的撇号版本,例如hasPair'在 的 where 子句中hasPair。当你想写另一个时,很容易不小心写了一个。我更喜欢go在这种情况下使用。但这并不是什么大问题,只要函数具有不同的类型。另一种是使用可能暗示某些东西的名称,但与函数的实际作用无关。napkin会属于这一类。当您重新访问此代码时,此命名选择可能会让您感到困惑,因为您会忘记命名它的最初原因napkin。(因为餐巾纸有 4 个角?因为它们很容易折叠?因为它们会清理杂物?它们在餐馆里被发现?)其他违规者是bobmyCoolFunc

如果您给函数起一个比goor更具描述性的名称h,那么您应该能够查看使用它的上下文或函数的主体,并且在这两种情况下都可以很好地了解原因选择了这个名字。这就是我的第 3 点所在:个人约定。唐的许多建议都适用。如果您在协作情况下使用 Haskell,请与您的团队协调并为常见情况确定某些约定。

于 2012-05-26T20:27:24.733 回答