まず、簡単な選択肢は、このためだけにMaybe
を取ることです「デフォルト引数」の種類:
inc :: Num a => Maybe a -> a -> a
inc Nothing x = 1 + x
inc (Just i) x = i + x
そうでなければ、可能ですが、それはおそらく価値がありません。このテクニックは、具体的な型(操作の結果)と関数(より多くの引数を受け入れる)のインスタンスを持つ型クラスを作成することです。
私たちは、増分の結果としての役割を果たすことができます種類のクラスを紹介:
class Inc i where
inc :: Integer -> i
、発信者が整数を要求した場合、我々は1ずつ増加:
instance Inc Integer where
inc = (+) 1
、発信者の要求した場合整数を返す関数は、その関数の引数でインクリメントします。
instance (Integral a) => Inc (a -> Integer) where
inc x = (+) x . toInteger
N OWこれらの作業の両方:
map inc [1, 2, 3]
map (inc 2) [1, 2, 3] :: [Integer]
しかし、結果は結果を使用して何かに[Integer]
に拘束されない限り、型注釈が必要です。具体的なInteger
の代わりにNum a => a
のようなジェネリック型を使用しようとした場合、またはのインスタンスに(Integral a) => Inc (a -> Integer)
のインスタンスを置き換えて、のいずれかの引数を受け入れるようにすると、型推論はさらに悪化します。一方、Int
とDouble
のような他の具体的な型のインスタンスを追加することもできます。
私の疑問に答えると、あなたは実際にどのような問題を解決しようとしていますか?
タイプクラスを介して複数の引数を持つ関数を持つことができます。ビットトリッキーは、たとえばDevelopment.Shake.cmdを参照してください。免責事項を追加したいのですが、これは初心者ではなく、もっと中間的なトピックです – epsilonhalbe
もう1つの免責事項として、技術的に可能な状況であっても、ハスケルの開発者が実際にやっていることではありません。私たちは常に*使用しています。また、それは痛みです。 – luqui
も参照してください:[増分アドホックパラメータ抽象化](https://byorgey.wordpress.com/2010/04/03/haskell-anti-pattern-incremental-ad-hoc-parameter-abstraction/)。 –