4

我是 Haskell 的新手,目前真正困扰我的是为什么制作库的人添加了调用的函数fst,而snd不是使用(正常)名称,如firstand second。后面的名字有什么问题?

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

4

3 回答 3

14

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

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

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

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

于 2013-05-17T21:13:35.390 回答
0

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

此外,由于它们都仅用于 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 个字符行的面向对象代码要漂亮得多。

于 2013-05-17T21:14:31.757 回答
0

snd和的一个优点fst是它们同样长并且代码可以很好地对齐。说

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 中使用可视模式同时更改它们。它在视觉上也困扰着我。

于 2013-05-17T21:56:28.347 回答