余分な型を定義する価値はありませんが、Int -> ... -> Int
シグネチャは絶対に避けてください。これらは、関数の使用方法を理解することを非常に困難にします。
実際、私はおそらく結果だけでなく、とりわけ引数の名前を変更するべきだと言います。誰かがあなたの関数を使用したい場合はその後、彼らは、コンパイラが引数を説明してみましょうことができます。
foo :: Price
foo = priceOfProduct _ _ + priceOfProduct _ _
は、コンパイラにあなたがしかし考慮しなければならない
Foo.hs:Y:X: error:
• Found hole: _ :: PriceOfProductFirstArgument
• In the first argument of ‘priceOfProduct’, namely ‘_’
In the expression: priceOfProduct _ _
In an equation for ‘foo’: main = foo = priceOfProduct _ _ + priceOfProduct _ _
のような(GHC> = 7.10)メッセージを表示しますあなたはタイプの区別はより剛性したくない場合は:シンプルtype
DEFが間違った順序で引数を入れてからあなたを救うことはできませんので、おそらくあなたは改善するだろう、それ
newtype Price = Price {priceInEuroCents :: Int}
これはまた、価格が与えられる通貨/数量の曖昧さを回避します。
'Int - > Int - > Price'は、関数の名前が既に価格を強く意味しているので、役に立たない。 'type Quantity = Int'と' UnitPrice = Int'を入力すると、より便利な 'priceOfProduct :: Quantity - > UnitPrice - > Price'が可能になります。 – chepner
これは、最後に収まるかどうか不明な場合に備えて、タイプを変更する簡単な方法です。 –