【问题标题】:Why Haskell's `fst` and `snd` have such a short (strange) names? [closed]为什么 Haskell 的 `fst` 和 `snd` 有这么短(奇怪)的名字? [关闭]
【发布时间】:2013-05-17 20:40:50
【问题描述】:

我是 Haskell 的新手,目前真正困扰我的是为什么制作这些库的人添加了名为 fstsnd 的函数,而不是使用像 firstsecond 这样的(正常)名称.后面的名字有什么问题?

我个人觉得这些缩写很荒谬: “为什么是snd?为什么不是secscndscd?或者为什么不是firfrstftfrt?” 它只是缺乏风格。 (但同样 - 这是个人意见)

【问题讨论】:

  • 为什么POSIX有一个叫做creat而不是create的函数?
  • 我喜欢basically the same question, applied to PHP instead of Haskell 的方式,有 105 个赞成票,而这一票仅以反对票结束...
  • @leftaroundabout 是的。 很久 以前,在 SO 严格讨论辩论之前就提出了这个问题,并且今天不会被容忍。 VtC。
  • 这个问题会非常好,如果它被编辑为只提出它提出的问题,而不是关闭它,它就会有答案。很明显,使用fstsnd 进行预测没有Haskell 特定甚至Miranda 特定的解释;参见例如Scott “作为格的数据类型” 1975 年,Milner “编程中的类型多态性理论” 1978 年以及后来的所有地方。也许像 p1 和 p2 或 π1 和 π2 这样的东西会更好?
  • 如果你把名字弄长了,那么用它们代替\(a,_)->a\(_,b)->b是没有用的,这就是fstsnd的定义跨度>

标签: function haskell convention


【解决方案1】:

很明显,选择的名称长度为 3 个字符,同时尽可能清晰地显示单词 - 除了最突出的辅音之外,所有的都漏掉了。很多标准函数都有更好/更容易理解的名称,但不可否认,不是全部!

这是历史上的意外,真的,名字是什么,我们不能做很多事情而不惹恼很多已经习惯它们并且拥有大量依赖它们的代码库的人。至少 Haskell 没有调用 search grep!

请随意在您的文件顶部写上first = fstsecond = snd - 使用您的首选名称不会花很长时间,ghc -O2 会编译出来。

firstsecond 实际上用于Control.Arrow 中更复杂的东西,但在这个阶段你不需要那么深入。

【讨论】:

  • 请注意:Control.Arrow 在 Haskell98 标准化 fstsnd 之后 出现。
  • @Rhymoid 绝对 - 我在暗示你可能想要使用 firstsecond 来做一些更有趣的事情。我没有将此作为短名称 fstsnd 的原因。
  • @Rhymoid 顺便说一句,如果 fstsnd 仅在 1998 年推出,我会感到非常惊讶;我认为它们是原创的。
  • ML 在 Haskell 存在之前有 hdtl 用于列表析构函数,我认为 Haskell 可能从 Miranda 继承了 fstsnd
  • 它们是从米兰达那里继承来的,但特纳也没有编造它们。
【解决方案2】:

这只是猜测,但我会试一试。两者都用于非常特定的情况。它们只访问只有两个元素的元组的第一个和第二个元素。它们不适用于其他大小的元组。在许多情况下,程序员可能有一个包含两个元素的类型,但他们不会使用元组,而是创建自己的类,因为它更具描述性。

此外,由于它们都只用于 2 元素元组,因此您可能经常会写 fst,而您的意思是 snd,反之亦然。这两个缩写都是 3 个字符,因此当您在意识到错误后返回并编辑源代码时,它不会更改代码的格式或移动该行中的任何字符。没那么重要,但还是不错的。

与面向对象的语言相反,haskell 中的许多代码都涉及将函数链接在一行中,拥有简短的函数以使其全部放在一行中是一种不错的选择。许多程序员每行使用 79 个字符,并且因为它太长而不必在您的一个函数中添加新行,这当然很有吸引力。尤其是使用守卫或模式匹配的函数。

展示简洁的haskell如何并且仍然具有良好的风格。

sum []     = 0
sum (x:xs) = x + sum xs

反对 C++

template <T>
T sum(list<T> lst)
{
   T s = 0;
   for(list<T>::iterator it=lst.begin();it!=lst.end();++it)
      s += *it;

   return s;
}

但这只是一个愚蠢的例子。

我认为它比一些具有 150 个字符行的面向对象代码要漂亮得多。

【讨论】:

    【解决方案3】:

    sndfst 的一个优点是它们同样长并且代码对齐得很好。说

    fun :: Bool -> (a, a) -> a
    

    现在,

    fun True  pair = fst pair
    fun False pair = snd pair
    

    对比

    fun True  pair = first pair
    fun False pair = second pair
    

    pair 这个词没有对齐,我无法在 vim 中使用可视模式同时更改它们。它在视觉上也让我感到困扰。

    【讨论】:

    • 虽然你的例子并不完全一致:你已经用额外的空间填充了True 以使第一个pair 列对齐; first 也可以这样做。另外,如果你 eta-reduce 这个函数,问题就不会再出现了。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多