我是Haskell的新手,现在让我感到困扰的是为什么制作库的人添加了名为fst
和snd
的函数,而不是使用{{1}这样的(普通)名称}和first
。后者的名字怎么了?
我个人认为这些缩写很荒谬:
“为什么second
?为什么不snd
,sec
或scnd
?或者为什么不scd
,fir
,frst
或{ {1}}?”
它只是缺乏风格。 (但再次 - 这是个人意见)
答案 0 :(得分:13)
这是历史上的偶然事件,真的,名字是什么,而且我们可以做很多事情而不会让许多习惯了他们且拥有大量代码库的人烦恼依靠它们。至少Haskell没有调用搜索grep!
您可以随意在文件顶部写下first = fst
和second = snd
- 它不会花费很长时间来使用您的首选名称,ghc -O2
会将其编译出来。
first
和second
实际上用于Control.Arrow中更复杂的内容,但您不需要在此阶段深入了解。
答案 1 :(得分: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个字符的面向对象的代码更漂亮。
答案 2 :(得分: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中的可视模式更改它们。它在视觉上也困扰我。