次の問題を考えてみましょう。タプルの長さ3のリスト(String、Int)が与えられた場合、同じ「Int」部分を持つ要素のペアはありますか?(たとえば、その[("bob",5),("gertrude",3),("al",5)]
ようなペアが含まれていますが、含まれてい[("bob",5),("gertrude",3),("al",1)]
ません。)
これは私がそのような関数を実装する方法です:
import Data.List (sortBy)
import Data.Function (on)
hasPair::[(String,Int)]->Bool
hasPair = napkin . sortBy (compare `on` snd)
where napkin [(_, a),(_, b),(_, c)] | a == b = True
| b == c = True
| otherwise = False
タプルの「Int」部分に名前をバインドするためにパターンマッチングを使用しましたが、最初に(メンバーのようにグループ化するために)ソートしたいので、パターンマッチング関数をwhere
句内に配置しました。しかし、これは私の質問に私をもたらします:句の中にある関数の名前を選ぶための良い戦略は何where
ですか?そんな名前を早く考えられるようになりたいです。この例では、「hasPair」は良い選択のように見えますが、すでに採用されています。パターンがたくさん出てくることがわかります-ヘルパー関数の自然に見える名前は、それを呼び出す外部関数によってすでに使用されています。そのため、時々、このようなヘルパー関数を「op」、「foo」、さらには「helper」と呼んでいます。ここでは、「ナプキン」を選択して、一度だけ使用することを強調しています。
それで、親愛なるStackoverflow読者、あなたは「ナプキン」と何と呼んだでしょうか?そしてもっと重要なことに、あなたは一般的にこの問題にどのようにアプローチしますか?