2013-05-17 22 views
2

我是Haskell的新手,目前真正困擾我的是爲什麼製作庫的人添加了名爲fstsnd的功能,而不是使用(普通)名稱,如firstsecond。後面的名字有什麼問題?爲什麼Haskell的`fst`和`snd`有這麼短的(奇怪的)名字?

個人而言,我發現這些縮寫可笑: 「???爲什麼snd爲什麼不secscndscd何不firfrstftfrt」 它只是缺乏風格。 (但同樣 - 這是個人意見)

+0

爲什麼POSIX有一個名爲'creat'而不是'create'的函數? – 2013-05-17 21:54:52

+7

我喜歡[基本上同樣的問題,應用於PHP而不是Haskell](http://stackoverflow.com/questions/150637/why-are-the-built-in-functions-in-php-named-so-隨機),有105 upvotes,而這一個只有負面投票關閉... – leftaroundabout

+4

@leftaroundabout是的。很久以前,這個問題在SO嚴格辯論之前就被問過了,今天不會被容忍。 VTC。 – AndrewC

回答

13

很明顯的名字被選爲長3個字符,而被儘可能明確爲兩個字 - 錯過了所有,但最突出的輔音。許多標準函數都有更好/更易於遵循的名字,但是不是所有的!

這是歷史上的事故,真的,名字是什麼,並且沒有太多的事情可以做,而不會讓很多習慣了它們的人煩惱,並且有大量的代碼依賴它們。至少Haskell沒有調用搜索grep!

隨意在文件頂部寫上first = fstsecond = snd - 使用您的首選名稱不會很長,並且ghc -O2會將它們編譯出來。

firstsecond實際上用於Control.Arrow更復雜的事情,但在此階段您不需要深究。

+1

只需要注意:在Haskell98標準化的'fst'和'snd'之後''Control.Arrow' *長*。 – 2013-05-17 21:55:54

+2

@Rhymoid肯定 -​​ 我暗示了你可能想用'first'和'second'來表示稍後更有趣的事情。我沒有把這個作爲短名「fst」和「snd」的理由。 – AndrewC

+0

@Rhymoid btw如果'fst'和'snd'只在1998年推出,我會非常驚訝;我認爲他們是原創的。 – AndrewC

0

這僅僅是猜測,但我給它一個鏡頭。這兩個都用於非常特殊的情況。它們只訪問只有兩個元素的元組的第一個和第二個元素。它們不適用於其他大小的元組。在許多情況下,程序員可能有一個有兩個元素的類型,而不是使用元組,他們將自己創建類,因爲它會更具描述性。另外,由於它們都只用於2元素元組,所以當您的意思是snd時,您可能會頻繁發生fst,反之亦然。這兩個縮寫都是3個字符,因此當您在意識到錯誤後返回並編輯源代碼時,它不會更改代碼格式或移動該行中的任何字符。不那麼重要,但仍然很好。

反對以面向對象的語言Haskell中大量的代碼涉及到一個線串聯起來的功能是一種不錯的短期作用,使其在同一行所有的擬合。許多程序員每行使用79個字符,並且肯定有一些內容吸引人,因爲它太長而不必在其中一個函數中添加新行。尤其是使用警衛或模式匹配的功能。

要顯示哈斯克爾如何簡潔可以,仍然有良好的作風。

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字符行一些面向對象的代碼更漂亮了很多。

0

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都同時使用可視化模式。它也讓我困惑。

+2

儘管你的例子並不一致:你已經用一個額外的空格填充了'True'來使第一個'pair'列對齊; 'first'也可以做同樣的事情。另外,如果你減少這個功能,問題就不會再出現了。 – leftaroundabout

相關問題