私は Haskell を初めて使用しますが、現時点で本当に気になるのは、ライブラリを作成した人々が、 and のような (通常の) 名前を使用する代わりに、 and と呼ばれる関数を追加した理由fstです。後者の名前の何が問題になっていますか?sndfirstsecond
個人的には、これらの略語はばかげsndているsecと思いscndますscd。スタイルに欠けているだけです。(繰り返しますが個人的な意見です)firfrstftfrt
私は Haskell を初めて使用しますが、現時点で本当に気になるのは、ライブラリを作成した人々が、 and のような (通常の) 名前を使用する代わりに、 and と呼ばれる関数を追加した理由fstです。後者の名前の何が問題になっていますか?sndfirstsecond
個人的には、これらの略語はばかげsndているsecと思いscndますscd。スタイルに欠けているだけです。(繰り返しますが個人的な意見です)firfrstftfrt
これは単なる推測ですが、試してみます。どちらも非常に特殊なケースで使用されます。要素が 2 つしかないタプルの最初と 2 番目の要素にのみアクセスします。他のサイズのタプルでは機能しません。多くの場合、プログラマーは 2 つの要素を持つ型を持っているかもしれませんが、タプルを使用する代わりに、より記述的であるため独自のクラスを作成します。
また、どちらも 2 要素のタプルでのみ使用されるため、意図したfstときに書いたりsnd、その逆を行ったりすることがよくあります。これらの省略形はどちらも 3 文字であるため、間違いに気付いた後でソースに戻って編集しても、コードの形式が変更されたり、その行の文字がシフトしたりすることはありません。それほど重要ではありませんが、それでもいいです。
オブジェクト指向言語とは対照的に、haskell のコードの多くは、関数を 1 行にまとめることを含みます。短い関数を使用して、すべてが 1 行に収まるようにするのは良いことです。多くのプログラマーは 1 行あたり 79 文字を使用していますが、関数の 1 つに長すぎるという理由で改行を入れる必要がないことには確かに魅力があります。特に、ガードやパターン マッチングを使用する関数。
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 文字の行を持つオブジェクト指向コードよりもずっときれいだと思います。
sndとの利点の 1 つ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 のビジュアル モードを使用して両方を同時に変更することはできません。視覚的にも気になります。