2016-12-13 11 views
3

の「補助」関数私の講師は、これはHaskellの標準または彼のプログラミングスタイルの癖である場合、私は思ったんだけど、私は前に見ていませんでした奇妙な癖があります。は、現時点ではHaskellの

基本的に、彼はしばしばこのような事をやる:

functionEx :: String -> Int 
functionEx s = functionExA s 0 

functionExA :: String -> Int -> Int 
functionExA s n = --function code 

は、彼がこれらの「補助」関数を呼び出し、そして大部分は、私がこれに見ることができる唯一の利点は、関数が呼び出し可能にすることです提供された議論が少ない。しかし、これらのほとんどは、とにかくコードに隠されています。私の見解では、元の呼び出しに引数を追加すると、はるかに読みやすくなります。

私は私が私の見解を示唆していないよ、言ったように正しいですが、私はちょうどそれをする前に、次のように行って見ていませんでしたし、それはHaskellで一般的ですかどうかを知りたいと思います。特殊なケースの定義が頻繁に使用されている場合

+5

通常、補助関数はトップレベルではなく、 'where'節にありますが、かなり一般的です。 – Lee

+1

別の定義で非表示にしたいものが最初に来るように、引数を並べ替えるのは、しばしば使われる異なる、曖昧な関連のトリックです。 'functionExA'が' Int-> String-> Int'ならば、あなたが感じるところならどこでも 'functionExA 0 :: String - > Int'を使うことができます。 – duplode

答えて

4

はい、これは当たり前、とだけでなく、関数型プログラミングです。それはあなたのコードへのインターフェースを分離するために、あなたのコードでは良いプラクティスです(この場合には、それは、関数のシグネチャ意味:あなたは合格する必要がどのような引数)の実装(再帰的なコードでカウンタまたは類似を持っている必要があります)の詳細からを。実世界のプログラミングで

、その一の症状は、デフォルト引数または1つの関数の複数のオーバーロードをしています。これを行うもう1つの一般的な方法は、そのインターフェイスを実装する特定のクラスではなく、インターフェイスのインスタンスを返すか、または取得することです。 Javaでは、コードが実際にArrayListArrayListListインターフェイスを実装している)を使用していることがわかっていても、ArrayListの代わりにListをメソッドから返すことを意味する場合があります。 Haskellでは、typeclassesはしばしば同じ機能を果たします。

実際の世界では、たまには常に最初にゼロになるはずの1つの引数がありますが、同じ関数を再帰的なスタイルで書く方法を示したいので、関数型プログラミングのティーチングではよくあります。テール再帰的。ラッパー関数は、両方の実装が実際に同じ結果を持つことを示すためにも重要です。 Haskellで

、それは次のようにwhereを使用する方が一般的です:

functionEx :: String -> Int 
functionEx s = functionExA s 0 where 
    functionExA s n = --function code 

この方法では、「本物」の機能のさえ存在は、外部インタフェースから隠されています。この関数がcount引数でtail-recursiveであるという事実を公開する理由はありません。

2

は、これを行うための利点することができます。たとえば、sum関数は折り畳み関数の特殊なケースに過ぎません。では、sum [1,2,3]の代わりにfoldr (+) 0 [1, 2, 3]を毎回使用しないでください。 sumははるかに読みやすいので。

+0

よく選ばれた例。 – duplode

関連する問題