2013-05-17 2 views
2

Я новичок в Haskell, и на самом деле меня беспокоит то, почему люди, добавившие в свои библиотеки, функции, называемые fst и snd, вместо использования (обычных) имен, таких как first и second. Что случилось с последними именами?Почему у Haskell `fst` и` snd` такие короткие (странные) имена?

Лично я считаю эти сокращения смешно: «? Почему? Почему snd не sec, scnd или scd Или почему не fir, frst, ft или frt» У него просто не хватает стиля. (Но опять же - это личное мнение)

+0

Почему у POSIX есть функция 'creat' вместо' create'? –

+7

Мне нравится, как [в основном тот же вопрос, примененный к PHP вместо Haskell] (http://stackoverflow.com/questions/150637/why-are-the-built-in-functions-in-php-named-so- случайным образом), имеет 105 upvotes, в то время как этот закрыт только с отрицательными голосами ... – leftaroundabout

+4

@leftaroundabout Yup. Этот вопрос был задан в течение долгого времени, прежде чем СО стал строго спорить, и сегодня его не терпит. VTC. – AndrewC

ответ

13

Понятно, что имена были выбраны для того, чтобы быть 3 символами в длину, будучи как можно яснее, чем слово - пропустить все, кроме самых выдающихся согласных. Многие стандартные функции имеют лучшие/простые в использовании имена, но, по общему признанию, не все!

Это историческая катастрофа, на самом деле, какие имена были, и мы не можем много сделать с этим, не раздражая многих людей, которые привыкли к ним и имеют большую базу кода, полагающуюся на них. По крайней мере, Haskell не вызывал поиск grep!

Не стесняйтесь писать first = fst и second = snd в верхней части файла - вам не потребуется много времени, чтобы использовать ваше имя, и ghc -O2 скомпилирует их.

first и second фактически используются для чего-то более сложного в Control.Arrow, но на этом этапе вам не нужно углубляться.

+1

Просто отметить: 'Control.Arrow' пришел * долго * после того, как Haskell98 стандартизовал' fst' и 'snd'. –

+2

@Rhymoid Определенно - я намекаю на предостережение, что вы, возможно, захотите использовать 'first' и' second' для чего-то более интересного позже. Я не дал этого в качестве причины для коротких имен 'fst' и' snd'. – AndrewC

+0

@Rhymoid btw Я был бы очень удивлен, если бы 'fst' и' snd' были введены только в 1998 году; Я думаю, что они оригинальны. – AndrewC

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 символами.

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. Это также беспокоит меня визуально.

+2

Хотя ваш пример не совсем последователен: вы уже добавили 'True' с дополнительным пространством для выравнивания первого столбца' pair'; то же самое можно сделать с помощью «first». Кроме того, если вы eta-уменьшите эту функцию, проблема больше не возникает. – leftaroundabout

Смежные вопросы